第12届北师大校赛热身赛第二场 B起床的烦恼
2016-01-01 11:58
399 查看
题目链接: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时。则须要数数数到多少。
附上代码:
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; }
相关文章推荐
- Http状态码(apache解析php的403错误)
- 在CodeBlocks 开发环境中配置使用OpenCV (ubuntu系统)
- Java 8 Lambda表达式
- 从零开始学Sketch——进阶篇
- ACE_Mesaage_Block,ACE_InputCdr,ACE_OutputCdr的使用
- MAC上安装、配置openfile服务器(ios即时通讯)
- Pashmak and Flowers
- 月光微博客
- 两个链表的合并
- ACCESS网站示例-连载-首页设计
- 在Linux下通过命令行来操作使用Dropbox
- 计算机组成原理-指令系统
- helloword
- Activity界面
- 电工助手 V1.2
- Two Sum III - Data structure design
- 批量创建&删除用户
- ACE Reactor FrameWork使用注意事项
- <5>噪点 信噪比
- 如何成为一个好的程序员(2)