Round Numbers POJ - 3252
题意:
如果你个数的二进制中1的个数要小于等于0的个数,那么这个数就符合题意。现在要你找出来区间[li,ri]这个区间内有多少这样的数
题解:
题意很明显了,是要用二进制,所以我们也把给的区间边界转化成二进制存在数组里面。然后再来枚举。要注意一点前导零可不能算在进去。比如1,它的二进制是1,那么也可以是01、001、0001等。所以前导零要排除。
dp[x][y][z]表示从开始到x位,没有前导零的前提下,已经有y个0,z个1。注意要没有前导零
在dfs过程中如果一个数前导零还存在情况下是不能直接返回dp值的,同样枚举到这个位置前导零还存在的话也不能赋值给dp数组比如二进制0001和1000他们在dp数组中所占的位置是一样的。这样就会错!
代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 #include<iostream>
5 using namespace std;
6 const int maxn=105;
7 typedef long long ll;
8 ll v[maxn],dp[maxn][maxn][maxn],ci,w[maxn];
9 ll dfs(int pos, int one, int zero, bool flag, bool limit)
10 {
11 if (pos == -1)
12 {
13 if (one <= zero) return 1;
14 return 0;
15 }
16 if (!limit && flag && dp[pos][one][zero] != -1) return dp[pos][one][zero];
17 int up = limit ? v[pos] : 1;
18 ll res = 0;
19 for (int i = 0; i <= up; i++)
20 {
21 if (i == 0)
22 {
23 if (flag) res += dfs(pos - 1, one, zero + 1, flag, limit && v[pos] == i);
24 else res += dfs(pos - 1, one, zero, flag, limit && v[pos] == i);
25 }
26 else res += dfs(pos - 1, one + 1, zero, true, limit && v[pos] == i);
27 }
28 if (!limit && flag) dp[pos][one][zero] = res;
29 return res;
30 }
31 ll solve(ll ans)
32 {
33 ll pos=0;
34 while(ans)
35 {
36 v[pos++]=ans%2;
37 ans/=2;
38 }
39 ci=pos;
40 return dfs(pos-1,0,0,false,true);
41 }
42 int main()
43 {
44
45 ll l,r;
46 memset(dp,-1,sizeof(dp));
47 scanf("%I64d%I64d",&l,&r);
48 printf("%I64d\n",solve(r)-solve(l-1));
49 return 0;
50 }
Round Numbers POJ - 3252的更多相关文章
- POJ 3252 Round Numbers(组合)
题目链接:http://poj.org/problem?id=3252 题意: 一个数的二进制表示中0的个数大于等于1的个数则称作Round Numbers.求区间[L,R]内的 Round Numb ...
- POJ 3252:Round Numbers
POJ 3252:Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10099 Accepted: 36 ...
- POJ 3252 Round Numbers
组合数学...(每做一题都是这么艰难) Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7607 A ...
- [ACM] POJ 3252 Round Numbers (的范围内的二元0数大于或等于1数的数目,组合)
Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8590 Accepted: 3003 Des ...
- poj 3252 Round Numbers(数位dp 处理前导零)
Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...
- POJ - 3252 A - Round Numbers
The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' ...
- POJ 3252 Round Numbers 数学题解
Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...
- POJ 3252 Round Numbers 组合数学
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13381 Accepted: 5208 Description The ...
- POJ 3252 Round Numbers(组合数学)
Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10223 Accepted: 3726 De ...
随机推荐
- 利用Python-docx 读写 Word 文档中的正文、表格、段落、字体等
前言: 前两篇博客介绍了 Python 的 docx 模块对 Word 文档的写操作,这篇博客将介绍如何用 docx 模块读取已有 Word 文档中的信息. 本篇博客主要内容有: 1.获取文档的章节信 ...
- P1273 有线电视网(树形动规,分组背包)
题目链接: https://www.luogu.org/problemnew/show/P1273 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树 ...
- cts project的创建修改和删除
事务码:SPRO_ADMIN进入 项目管理界面,点击工具栏创建项目(F5),弹出对话框,输入项目名称,回车确定. 标题中输入项目的描述.点击保存.如图: 点击图片放大 注:要想此项目在CTS建立请求的 ...
- BAPI_PO_CHANGE
这两天用BAPI更改采购订单,遇到了一些问题,最后调试解决了.记录如下吧.要修改的是采购订单的物料号和批次,在网上看到其它人写过关于 BAPI_PO_CHANGE的用法,但是具体问题还要具体分析啊. ...
- 解决ubuntu获取root账号并开通ssh
1.设置root密码 sudo passwd root 2.修改etc/ssh/sshd_config文件 su - root vi /etc/ssh/sshd_config LoginGraceTi ...
- 与图论的邂逅05:最近公共祖先LCA
什么是LCA? 祖先链 对于一棵树T,若它的根节点是r,对于任意一个树上的节点x,从r走到x的路径是唯一的(显然),那么这条路径上的点都是并且只有这些点是x的祖先.这些点组成的链(或者说路径)就是x的 ...
- centos7安装docker、docker-compose、es7.3.0、kibana7.3.0
一.安装docker 1.更新yum包 sudo yum update 2.卸载旧版本(如果安装过旧版本的话) sudo yum remove docker docker-common docker- ...
- windows中使用django时报错:A server error occurred. Please contact the administrator.
这是因为在视图函数中使用了get函数,获取了不存在的数据例如:数据库中不存在一条name为hello1的数据,使用如下语句访问message = Message.objects.get(name='h ...
- (02)-Python3之--列表(list)操作
1.定义 列表的关键字:list 列表以[]括起来,数据之间用 , 隔开.列表当中的数据,可以是任意类型.数值是可以重复的. 列表元素是 可变的,顺序是 有序的. 例如: b = ["萝卜& ...
- Golang 单元测试:有哪些误区和实践?
https://mp.weixin.qq.com/s/k8WNWpCIVl4xTmP3TQ_gxQ