POJ3252 Round Numbers【组合问题】
来源:互联网 发布:淘宝评价截图怎么弄 编辑:程序博客网 时间:2024/06/02 13:16
题目链接:
http://poj.org/problem?id=3252
题目大意:
给你两个十进制数 A 和 B,求其对应闭区间 [A,B] 内有多少个Round Numbers。
Round Numbers 是指:如果一个十进制数对应的二进制数中的 0 的个数多于 1 的
个数,则该数就是一个 Round Numbers。
解题思路:
参考博文:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122758.html
计算闭区间 [A,B] 内有多少个Round Numbers,只需要分别求出[0,A] 内有多少
个Round Numbers,[0,B+1] 内有多少个Round Numbers,然后后者减去前者即
可。
那么如何来求[0,A]闭区间的 Round Numbers。
第一步先把 A 转换为二进制数,存入数组 Binary[] 数组中,其中 Binary[0]存放二进
制数数位长度。
再分为两部分计算区间内 Round Numbers:
①长度小于二进制数位长度 Binary[0] 的部分:
这部分的最高位肯定为 1,剩下数位可供放入数字的位数为 Binary[0]-1,从低位向高
位考虑情况。方案数和sum要加上各种放置情况。
for(int i = 1; i < Binary[0]-1; ++i) { for(int j = i/2+1; j <= i; ++j) sum += C[i][j]; }
②长度等于二进制数位长度 Binary[0]的部分:
从高位向低位搜索除最高位外置为 1 的数位,并统计 1 的位数,然后方案数 sum
加上各种情况。
int Zero = 0; for(int i = Binary[0]-1; i >= 1; --i) { if(Binary[i]) { for(int j = (Binary[0]+1)/2-(Zero+1); j <= i-1; ++j) sum += C[i-1][j]; } else Zero++; }
AC代码:
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;int C[33][33];void ZuHe(){ C[0][0] = C[1][0] = C[1][1] = 1; for(int i = 2; i <= 32; ++i) { C[i][0] = C[i][i] = 1; for(int j = 1; j < i; ++j) C[i][j] = C[i-1][j] + C[i-1][j-1]; }}int Binary[35];void Change(int N){ Binary[0] = 0; while(N) { ++Binary[0]; Binary[Binary[0]] = N%2; N /= 2; }}int Solve(int N){ Change(N); int sum = 0; for(int i = 1; i < Binary[0]-1; ++i) { for(int j = i/2+1; j <= i; ++j) sum += C[i][j]; } int Zero = 0; for(int i = Binary[0]-1; i >= 1; --i) { if(Binary[i]) { for(int j = (Binary[0]+1)/2-(Zero+1); j <= i-1; ++j) sum += C[i-1][j]; } else Zero++; } return sum;}int main(){ ZuHe(); int A,B; while(~scanf("%d %d",&A,&B)) { printf("%d\n", Solve(B+1)-Solve(A)); } return 0;}
0 0
- POJ3252 Round Numbers【组合问题】
- poj3252.Round Numbers,组合数
- POJ3252 Round Numbers 组合数学||数位DP
- POJ3252——Round Numbers(组合数)
- POJ3252 Round Numbers
- POJ3252 Round Numbers
- poj3252 Round Numbers
- poj3252 Round Numbers
- poj3252--Round Numbers
- poj3252 Round Numbers
- POJ3252 Round Numbers
- poj3252 Round Numbers
- POJ3252 Round Numbers
- POJ3252-Round Numbers
- poj3252 Round Numbers
- poj3252[Round Numbers]
- 【POJ3252】 Round Numbers
- POJ3252-Round Numbers
- 谷歌地图api
- 我们每个人都有自己的生活方式
- linux中文件描述符fd和文件指针flip的理解
- hdu 5423 Rikka with Tree(dfs)
- 面试10大算法汇总+常见题目解答
- POJ3252 Round Numbers【组合问题】
- PAT (Basic Level) Practise (中文) 1017. A除以B (20)
- UIday0601:UISegmentedControl的属性和用法
- 多线程安全问题及解决办法
- 字符设备驱动copy_to_usr
- 模板函数和模板类的区别
- iOS开发 ----- UI生命周期
- 链你妹系列1—关于链表,不得不吐槽的那些事
- 黑马程序员——网络编程