考试总结-3
又炸了。。(其实我考好时不发总结。。。咳咳)
题目链接🔗
pdf有着更好的阅读效果。。。🔗
T1(最近数学题好多啊)
一个小结论题,其实讲过之后还是蛮简单的。
题解:我们会发现一个事情,$B^i\%(B-1)=1$ 。然后从$ 0 $到$ (B-1) $每个数都至少出现$ 1 $次。我们求的和就是$ \sum a[i]*i*B^i $,然后因为上面那条,所以只要满足$ \sum a[i]*i $是$(B-1)$的倍数就行。为了使最后的数最大,我们尽量删去尽可能少的数。所以删去的数就是$\sum a[i]*i$% $(B-1)$。然后找的时候直接二分就好了。。
反思:1.考试时想到了第一步,但没能继续思考剩下的如何处理。对于数学题还是一贯的蒙圈。。。
2.好多人因为没开$ long\ long $导致丢了好多分,要注意看数据范围。
T2(暴力没拿满。。。)
理论上还是个水题。可我就是个。。(算了,不侮辱蒟蒻这个词了。。)
题解:50% 瞎搞可过。
100% 考虑DP。
当$ m=1 $时,$ f[i][j] $表示到取到第$ i $块,一共咬了$ j $口时能吃到的最大权值和。
转移:不选:$ f[i][j]=max(f[i][j],f[i-1][j]) $
选: $ f[i][j]=max(f[i][j],f[k][j-1]+s[i]-s[k-1])\ 1\le k\le i-1 $
($ s[i] $为前缀和数组)
当$ m=2 $时,
转移: 当什么都不做时:$ f[i][j][l]=max(f[i][j][l],f[i][j-1][l],f[i-1][j][l]) $
当仅从第一行取一段区间时:
$ f[i][j][l]=max(f[i][j][l],f[k][j][l-1]+s[i][1]-s[k][1]) \ 1<=k<=i-1 $
当仅从第二行取一段区间时:
$ f[i][j][l]=max(f[i][j][l],f[i][k][l-1]+s[j][2]-s[k][2]) \ 1<=k<=j-1 $
当$i=j$时,可以竖着转移:
$ f[i][j][l]=max(f[i][j][l],f[k][k][l-1]+s[i][1]+s[j][2]-s[k][1]-s[k][2]) \ 1<=k<=i-1 $
最后所有情况取即可。
反思:1.白送的50没拿到……对自己无语ing。在前缀和序列里查询时要从$ 0 $开始,要不然会自动忽略$ a[1] $......(55555....)
2.对于DP的掌握程度不够,不敢写正解,怕暴力错。。
T3 (难度还(hao?)行(da?))
据JZYshuraK介绍,这题死难死难的。。。然后。。342和Ysy20021208都切了。。本蒟蒻都没怎么想。。。
题解:还以为是一眼逆序对,(woc...逆序对差点写不出来了。。),后来惊讶的发现,差了点东西。。
实际上是在逆序对的基础上做的一道题。我们用$ pos[i] $记录每个数的位置。
我们可以从小到大枚举,假设该数最大,使它成为序列的一个结尾,显然最小的数产生的逆序对数量等于$ pos[i]-1 $,它成为最大值之后会增加$ n-pos[i] $个新的逆序对,所以我们可以先求出原先序列的逆序对, 然后从小到大枚举数为最大数, 修改逆序对的数量, 然后取$min$。
反思:没有好好读题。。。没有合理分配时间。