第一题:
题目大意:求出1-10^n 这些数中,包含数字3的有多少个。 n<=1000;
解题过程:
1.这题一看就是高精度+递推。。如果n=1000,那么假设个位是3,其他999位任意。。那么就有10^999个数了。
2.用F[i] 表示 所有位数为 i的数中 有多少个包含3的,g[i] 表示 1-10^i 中有多少个包含3的。
显然 g[i]=sum(F[1...i]) ;F[i]的转移需要分类讨论:
A:第i位是3,那么有10^(i-1)个数字。
B:第i位不是3,那么第i位有8种选择,剩下的数有g[i-1]种方案,一共8*g[i-1];
所以F[i]=8*g[i-1]+10^(i-1);
另外在求10^(i-1)的时候,我用了(int)pow(10,i-1),结果却得到:
(int)pow(10,1)=10
(int)pow(10,2)=99
(int)pow(10,3)=1000
(int)pow(10,4)=9999;
原来pow返回的是一个实数,实际存储的时候 10000 就是9999.99999999...99 强转成int 就会损失精度。
吸取个教训。
第二题:
题目大意:选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。S<=1000
解题过程:
1.水题。。把每个数的约束和计算出来就变成一个裸的01背包问题。
第三题:
题目大意:求最大二分图匹配。。
解题过程:
1.果断不会做,果断爆搜,果断骗到30分。。把匈牙利算法琢磨透了再补上。