【PNR#2 Div1 A】恰钱(数位 DP)

恰钱

题目链接:PNR#2 Div1 A

题目大意

给你一个区间,要你判断里面是否有数满足二进制 1 个数等于末尾 0 个数,如果有就找出一个。

思路

考虑直接上数位 DP,就用二进制来 DP 即可。
维护是否在碰左边界右边界,1 的个数,末尾连续 0 的个数,以及当前形成的数。

然后分 0,1 讨论一下,具体看代码。

代码

#include<cstdio> using namespace std; int q, l, r; int slove(int now, bool ld, bool rd, int num1, int lst0, int val) { if (now < 0 && val && lst0 == num1) return val; if (lst0 + now + 1 < num1) return -1; if (!ld && !rd) { if (!val) return -1; if (((num1 + 1) + 1 <= now + 1) || (num1 == lst0 + now + 1)) { if (((num1 + 1) + 1 <= now + 1)) return val | (1 << (num1 + 1)); else return val; } return -1; } for (int i = (ld ? ((l >> now) & 1) : 0); i <= (rd ? ((r >> now) & 1) : 1); i++) { if (i == 0) { int x = slove(now - 1, ld & (i == ((l >> now) & 1)), rd & (i == ((r >> now) & 1)), num1, lst0 + 1, val); if (x != -1) return x; } else { int x = slove(now - 1, ld & (i == ((l >> now) & 1)), rd & (i == ((r >> now) & 1)), num1 + 1, 0, val | (1 << now)); if (x != -1) return x; } } return -1; } int main() { // freopen("ex_data3.in", "r", stdin); // freopen("write.txt", "w", stdout); scanf("%d", &q); while (q--) { scanf("%d %d", &l, &r); printf("%d\n", slove(31, 1, 1, 0, 1, 0)); } return 0; }

__EOF__

本文作者あおいSakura
本文链接https://www.cnblogs.com/Sakura-TJH/p/PNR_2_Div1_A.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   あおいSakura  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2021-10-27 【luogu P3506】MOT-Monotonicity 2(线段树)
2021-10-27 【luogu AT5160】Numbers on a Circle(贪心)(堆)
2021-10-27 【luogu AT5159】RGB Balls(贪心)
2021-10-27 【luogu P5435】基于值域预处理的快速 GCD(数学)
2021-10-27 【luogu P4338】【LOJ 2434】历史(LCT)
2021-10-27 【ybtoj高效进阶 21174】景区旅行(二分)(倍增)(状压DP)(DP)
2021-10-27 【luogu AT1999】Candy Piles(博弈论)
点击右上角即可分享
微信分享提示