2018.7.9 && 2018.7.10 模拟赛总结
Posted miracevin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018.7.9 && 2018.7.10 模拟赛总结相关的知识,希望对你有一定的参考价值。
2018.7.9:
T1:
原题吃夜宵,可是还是不会。
对于剩下的钱不能用来买其他的东西怎么处理,毫无头绪。
正解:
将礼物的价值排序,每次钦定一个礼物,这个礼物要被剩下,这个礼物之前的礼物都买走的方案数。
因为价值是从小到大排序的,我们先算出来之前所有礼物的价值总和,计算出剩下的钱数。
用这个礼物之后的所有礼物跑一个背包,(注意是之后的礼物,这个礼物已经钦定不买)f[j]表示花了j元钱,买的方案数。
这样,剩下的钱数必须在这个礼物价值之下,O(n)扫一遍f[j],统计一下方案数。
依次从前往后枚举剩下哪个即可。
但是这个是N^3的,
所以考虑调一下顺序。我们发现,每次钦定了一个较小的i不买,但是之后的i+10,i+1000,等要被背包很多遍,而且许多数都是一样的。是没有必要的。
所以倒序。
钦定最后一个不能买,这个直接算就好了。
倒数第二个不能买,用倒数第一个跑背包,,,统计。、
倒数第三个不能买,倒数第二个继续上一次跑的背包结果继续跑。
。。。。
这样利用平时背包的外层循环物品的顺序,就可以每次只加上一个物品跑背包。
复杂度:O(n^2)枚举*扫描统计
为什么这样做会不重不漏呢?
第一,我们每次钦定剩下了一个礼物,那么每次只能剩下比这个礼物少的钱数,统计一下,是不会重、漏的。
第二,随着循环,每次会有一个礼物一定不选,而下一次这个礼物一定选。这样是不会重复的。
第三,每次背包跑的是礼物之后的所有礼物,根据0/1背包倒序循环的技巧,这样也是不重不漏的。
T2:
打表找规律,O(1)公式就好了。
该死long double可能数据大了会挂,不知道为什么。
czy:Windows环境下,long double可能会挂。
感谢ryc借用我的linux环境评测,证明long double在linux下是可以的。(noip就放心了)
不过不必要的时候,最好不要用long double ,毕竟这个就一个O(1)公式直接算,精度误差没有多少。
long double输出:%Lf
正解:
“算法:组合数学题
可以将原问题转化一下,看成是在一个二维平面上行走,+1看成移动(1,0)
-1看成移动(0,1),那么到达(N,M)点且路线又不走到y=x这条直线上方的路线总数就是
答案,这个组合问题很经典,方案数为C(M,M+N)-C(M-1,M+N),所以
可以知道答案就是1-M/(N+1) ”
T3:
数位DP
思路比较正确。也处理出来了n-1位及以下的符合数目了。
但是处理最上面一层的方案还是有待改进。(即:e.g. : 100..00~342..34 )
gsh的方法是:
递归处理。例如:7320926
考虑第一位,如果不放限制位的话,有6(无0)*10^3*9^3 即:前一半随便放,后面一半不能放这个数。(并且放的数字是没有限制的)
如果放限制位的话,递归进入下一位:
这一位不放3,有3(0,1,2)*10^2*9^3...
.....
每次选择放限制位的情况递归下去。。。
直到过了一半:
9这一位:
如果不放9,因为和9对应位是2,所以这一位不能放2的。
有: (9-1)*9^2种。
放9递归到下一位:
是2。
不放2,因为这里对应位是3,比2大,可以放0,1两种
所以是:2*9^1
递归到6
不放,6种
放,1种,直接回溯了。
最后把答案统计上就可以了。
应该对于最上面一层的处理方法还可以用dp。因为限制是对称的。
设f[i][0/1]表示,从外往里第i,和第n-i+1(n是位数)个数,限制、不限制,合法的方案数。
统计出来合法的。
两种方法,最后都加上n-1以下位预处理的结果。
1~9 ten[1]=9
10~99 ten[2]=81
100~999 ten[3]=810
1000~9999ten[4]=7290
发现和9的次方有关,递推即可,要么乘10,要么乘9
总结:
第一题应该有一些想法的。通过枚举每个礼物不买,可以确定出哪个礼物一定要买,哪个可买可不买。更关键的是,知道了统计答案的时候,选择f[j]中的哪些部分。
第三题1.5h并没有想出正解。半天容斥发现太麻烦。最后才想出dp,可惜时间不够了。还是应该观察性质,对称dp就可以统计了。
140/300 ez rank1 赵予茁 230分
以上是关于2018.7.9 && 2018.7.10 模拟赛总结的主要内容,如果未能解决你的问题,请参考以下文章