| 题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 失误原因(初次提交分数) |
|---|---|---|---|---|---|
| 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);
}
}
|