NOIP模拟测试31

好久没写题解了,感觉很多好题没留下什么就这么过去了,着急改题很多细节和原理都没有注意到,思考也不够(考得越来越差),所以还是很有必要写的。

A. math

看到后的确没什么可接受复杂度的思路。直接说做法吧。

70%:O(nk^2)

把每个ai看成一组,由(ai*bi)%k知每组最多有k个物品(循环节),然后问题就转化为一个分组背包,看有多少个<k的非负整数能被凑出。

由于循环节长远不到k,所以骗到了70分。。。

70%:O(nklogk)

观察到上面对每个物品都要遍历一次容量,而很多容量是无用状态。最明显的,对于一个组内的物品,其实是一个物品重复放很多次而算作一次。

然后我们可以发现分组没有什么用,定义一个单个物品为权值为ai,数量为ai在模k意义下的能取到值的个数,即循环节长度。

接着这个多重背包就可以用二进制优化了。

扫描二维码关注公众号,回复: 7094802 查看本文章

80%:O(nk)

发现一个容量会被重复凑出很多次。

放在模k意义下,那么答案最多有k个。设dp[k]为k能否被凑出,然后搜索用n个物品反复拓展到新状态即可。

100%:O(n+k)

从给的样例中其实就能看出答案是个等差数列,yy一下能发现公差就是ai和k的gcd

然后就AC了。。。。。。

考场上我这都没看出来额。。。

正确性:

ax+by=c(mod k)有整数解当且仅当 d|c,

那么ax+by+cz+....=q(mod k)有整数解当且仅当gcd(a,b,c,...)|q

其实就是裴蜀定理的推论。

B. biology

考试的时候一直在想图论,然后最后就打了一个n^2m^2的拓扑跑了。。。

后来一想DAG拓扑不就是dp吗。。。

拓扑没办法优化可是dp可以

40%:O(n^2m^2)朴素dp:f[i][j]=max(f[k][l]+b[i][j]+|i-k|+|j-l|)

80%:O(nmlognlogm)

柿子套路,遇到绝对值要拆开

之后就可以用四个二维树状数组维护了。

100%:

切比雪夫距离

先鸽一下

猜你喜欢

转载自www.cnblogs.com/hzoi-yzh/p/11409248.html