uva1350 Pinary(递推)
来源:互联网 发布:linux 打开本地目录 编辑:程序博客网 时间:2024/06/04 19:24
题意:求第k大的无前导0和连续1的二进制数
解法:递推+二分查找
1.得到st[i]:第i位是1的前i位数列个数,sum[i]:前i为数列个数和
st[i]=st[i-2]+st[i-3]+…+st[0]
该递推式等价于st[i]=st[i-1]+st[i-2]
2.二分查找sum序列。并减去由于l位为1,l-1位不能为1的中间略去的数(sum[l-1]+1)
# include<iostream># include<cstdio># include<algorithm># include<queue># include<stack># include<math.h># include<cstring># define INF 0x3f3f3f3f# define ll long longusing namespace std;const int maxn = 1000+10;const int maxm = 90000000+10;int t,n;int tmp;int st[maxn],sum[maxn];//st[i]:第i位是1的前i位数列个数;int ans[maxn];int maxx;int main(){ st[1]=st[2]=1; sum[1]=1,sum[2]=2; for(int i=3;i<maxn;i++){ st[i]=st[i-1]+st[i-2]; sum[i]=st[i]+sum[i-1]; if(sum[i]>maxm) {tmp=i; break; } } //freopen("a.txt","r",stdin); scanf("%d",&t); while(t--){ scanf("%d",&n); maxx=0; memset(ans,0,sizeof(ans)); while(n){ int l=lower_bound(sum+1,sum+tmp+1,n)-sum; maxx=max(maxx,l); ans[l]=1; n-=(sum[l-1]+1); } for(int i=maxx;i>=1;i--){ printf("%d",ans[i]); } printf("\n"); } return 0;}
0 0
- uva1350 Pinary(递推)
- UVA 1350 - Pinary(数论+递推)
- UVA - 1350 Pinary (递推)
- LA3357 Pinary (递推)
- UVA 1350&&LA 3357 Pinary(递推)
- uva1350 - Pinary 第N个满足条件的二进制数
- Sicily 1327 Pinary (SOJ 1327) 【dp 动态规划】
- 1327. Pinary
- LA3357 Pinary
- LA3357 Pinary
- poj1664 (递推)
- 核电站(递推)
- poj1664(递推)
- hdu2524(递推)
- HDU2045 (递推)
- hdu1207(递推)
- hdu1267(递推)
- Triangles(递推)
- 规则引擎开发小结
- iOS的UILabel设置居上对齐,居中对齐,居下对齐
- DB2 执行Sql 语句中时的with ur
- 烤鸭的gerrit使用总结
- Linux环境配置增强型的Oracle简单客户端-Instant_Client
- uva1350 Pinary(递推)
- contiki 启动进程 process_start
- Coincidence
- C++模板及模板特化
- svn配置到windows自启动服务中
- Android中图片资源适配
- LeetCode 19 Remove Nth Node From End of List 移除倒数第N个节点
- 网页设计
- fn标签的用法