第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时,则需要数数数到多少。
附上代码:
题目大意:
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; }
相关文章推荐
- 第12届北师大校赛热身赛第二场 B起床的烦恼
- 第12届北师大校赛热身赛第二场 A.不和谐的长难句1
- 第12届北师大校赛热身赛第二场 C. 组合数
- 第12届北师大校赛热身赛第二场 A.不和谐的长难句1
- 第12届北师大校赛热身赛第二场 C. 组合数
- FOJ有奖月赛-2016年4月(校赛热身赛)
- FZU Problem 2222 ABCDEFG(水题)——FOJ有奖月赛-2016年4月(校赛热身赛)
- 浙江财经大学校赛热身赛
- 中南大学ACM12月月赛第二场热身赛解题报告
- 第14届 浙江财经大学 校赛热身赛
- FOJ有奖月赛-2017年4月(校赛热身赛) random password(DP)
- “师创杯”SDUT-ACM校赛热身赛-疯狂的bLue
- FOJFOJ有奖月赛-2012年4月(校赛热身赛)-解题报告总结
- HUST2012校赛,USC2013新队员训练第二场
- 起床的烦恼
- zhejiang省赛热身赛之---周赛第二场
- 2017年多校赛第二场 1011的一些想法
- 郑州大学第八届校赛热身赛题解
- 郑大第九届校赛-热身赛-zzulioj-1809-make pair
- 18 校赛热身赛 C - Sometimes Naive (状态压缩)