您的位置:首页 > 其它

第12届北师大校赛热身赛第二场 B起床的烦恼

2014-04-25 21:52 169 查看
题目链接:http://www.bnuoj.com/bnuoj/contest_show.php?cid=3570#problem/43572

题目大意:

Nono从一开始数数,他每数一个数时会计算这个数中1的个数(如211中有两个1)并对1的个数进行累和,当1的个数之和不小于x时,nono就要起床了。特别需要注意的是,当nono数数达到10000时,nono就会因为数太久而再次睡着……

现在nono定下了x,他想知道他数到多少就需要起床了(或是他可以再睡一觉)。

明显是动态规划问题,通过递推预处理可以比较快的得出,a[i]=a[i-1]+sum一边不断的累加到数i时,1的个数,一边当 i%10==1时,更新a[case]=i,即当x=case时,则需要数数数到多少。

附上代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAX=100001;
int a[MAX];
void init()
{
int cas=1;
for(int i=1;i<MAX;i++)
{
int k=i,sum=0;
while(k)
{
if(k%10==1)
{
sum++;
a[cas++]=i;//关键部分
}
k/=10;
}
a[i]=a[i-1]+sum;
}
}
int main()
{
init();
int T;
while(cin>>T)
{
while(T--)
{
int n;
cin>>n;
if(a
<10000)
{
cout<<a
<<endl;
}
else
{
cout<<"zzz"<<endl;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: