2018.7.9 && 2018.7.10 模拟赛总结

2018.7.9:

原题吃夜宵,可是还是不会。

对于剩下的钱不能用来买其他的东西怎么处理,毫无头绪。

正解:

将礼物的价值排序,每次钦定一个礼物,这个礼物要被剩下,这个礼物之前的礼物都买走的方案数。

因为价值是从小到大排序的,我们先算出来之前所有礼物的价值总和,计算出剩下的钱数。

用这个礼物之后的所有礼物跑一个背包,(注意是之后的礼物,这个礼物已经钦定不买)f[j]表示花了j元钱,买的方案数。

这样,剩下的钱数必须在这个礼物价值之下,O(n)扫一遍f[j],统计一下方案数。

依次从前往后枚举剩下哪个即可。

但是这个是N^3的,

所以考虑调一下顺序。我们发现,每次钦定了一个较小的i不买,但是之后的i+10,i+1000,等要被背包很多遍,而且许多数都是一样的。是没有必要的。

所以倒序。

钦定最后一个不能买,这个直接算就好了。

倒数第二个不能买,用倒数第一个跑背包,,,统计。、

倒数第三个不能买,倒数第二个继续上一次跑的背包结果继续跑。

。。。。

这样利用平时背包的外层循环物品的顺序,就可以每次只加上一个物品跑背包。

复杂度:O(n^2)枚举*扫描统计

为什么这样做会不重不漏呢?

第一,我们每次钦定剩下了一个礼物,那么每次只能剩下比这个礼物少的钱数,统计一下,是不会重、漏的。

第二,随着循环,每次会有一个礼物一定不选,而下一次这个礼物一定选。这样是不会重复的。

第三,每次背包跑的是礼物之后的所有礼物,根据0/1背包倒序循环的技巧,这样也是不重不漏的。

T2:打表找规律,O(1)公式就好了。

该死long double可能数据大了会挂,不知道为什么。

不必要的时候,最好不要用long double ,毕竟这个就一个O(1)公式直接算,精度误差没有多少。

T3:数位DP

思路比较正确。也处理出来了n-1位及以下的符合数目了。

但是处理最上面一层的方案还是有待改进。(即:e.g. : 100..00~342..34 )

gsh的方法是:

递归处理。例如:7320986

考虑第一位,如果不放限制位的话,有6(无0)*10^3*9^3 即:前一半随便放,后面一半不能放这个数。(并且放的数字是没有限制的)

如果放限制位的话,递归进入下一位:

这一位不放3,有3(0,1,2)*10^2*9^3...

.....

每次选择放限制位的情况递归下去。。。

直到过了一半:

9这一位:

如果不放9,因为和9对应位是2,

猜你喜欢

转载自www.cnblogs.com/Miracevin/p/9290037.html