题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 失误原因(初次提交分数) |
---|---|---|---|---|---|
Faulty Odometer | ★★☆☆☆ | 答案正确 | 100 | 2014-11-07 13:50:44 | 编译错误(编译器位数导致)(0) |
(WHU 2014-11-7练习赛)
一个有bug的里程表盘,会自动跳过带数字3和8的数,问显示数字为N时,实际里程数有多少。
还是递推的思路,先计算出10^i以下一共会跳过多少数,于是有
f[i]=f[1]*pV[i-1]+f[i-1]*10-f[1]*f[i-1];//pV[n]表示10^n
然后再去统计每一位,比如3012可以抽象成3000+000+10+2,然后每一位统计累加:
Missed+=f[i-1]*(e-msdD[e])+t*msdD[e];//msdD[e]表示数字e以下的被忽略的数有几个,e表示当前位的数字,i是位数
4278.cpp代码已折叠
展开折叠内容
|
---|
#include<cstdio> const int pV[11]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000}, msdD[10]={0,0,0,1,1,1,1,1,2,2}; int f[11]={0,2}; void init() { for(int i=2;i<=10;++i) { f[i]=f[1]*pV[i-1]+f[i-1]*10-f[1]*f[i-1]; // printf("[%d]",f[i]) ; } } int main() { init(); while(1) { int n; scanf("%d",&n); if(n==0) return 0; int Missed=0; for(int i=1,u=n,t=1;u;++i,u/=10,t*=10) { int e=u%10; Missed+=f[i-1]*(e-msdD[e])+t*msdD[e]; } printf("%d: %d\n",n,n-Missed); } } |