AcWing 339 .圆形数字
大型补档计划
设 \(f[i][j]\) 表示二进制下,数字有 \(i\) 位, \(0\) 的个数 - \(1\) 的个数 \(=\) \(j\) 的方案数
\(f[0][0] = 1;\)
填一个 \(0\)
\(f[i + 1][j + 1] += f[i][j]\)
填一个 \(1\)
\(f[i + 1][j - 1] += f[i][j]\)
考虑到负下标越界,需要加偏移量
然后数位 dp 的细节蛮多的,比如第一位如果选 0 的话得特判,因为dp包括了前导0在内加入计算,所以得额外处理一个 \(g[i]\) 表示一共 $ <= i$ 位,符合条件的个数。
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 31, D = 30;
int a, b, d[N];
int f[N][N << 1], g[N];
void init() {
f[0][D] = 1;
for (int i = 0; i + 1 < N; i++) {
for (int j = 0; j <= D * 2; j++) {
if (!f[i][j]) continue;
if (j < D * 2) f[i + 1][j + 1] += f[i][j];
if (j) f[i + 1][j - 1] += f[i][j];
}
}
g[0] = g[1] = 1;
for (int i = 2; i < N; i++) {
g[i] = g[i - 1];
for (int j = D + 1; j <= D * 2; j++) g[i] += f[i - 1][j];
}
}
int solve(int x) {
if (x == 0) return 1;
int n;
for (int i = N - 1; ~i; i--)
if (x >> i & 1) { n = i; break; }
for (int i = 0; i <= n; i++) d[i] = x >> i & 1;
int p = 0, res = 0;
// p:目前 0 的个数 - 1 的个数
for (int i = n; ~i; i--) {
// 有 i + 1 位
if (d[i]) {
if (i == n) res += g[i];
else for (int j = D - (p + 1); j <= D * 2; j++) res += f[i][j];
p--;
} else p++;
if (i == 0 && p >= 0) res++;
}
return res;
}
int main() {
init();
scanf("%d%d", &a, &b);
printf("%d\n", solve(b) - solve(a - 1));
}
AcWing 339 .圆形数字的更多相关文章
- AcWing 842. 排列数字
深搜的一道水题 https://www.acwing.com/problem/content/844/ 正确输入输出 #include<bits/stdc++.h> using nam ...
- BadgeView 圆形数字提醒 购物车常用
实际上BadgeView这个类就是继承TextView的.很多TextView中设置字体的方法都适用于BadgeView. 1. setTargetView(View) --> 设置哪个控件显示 ...
- javascript 通过面向对象编写圆形数字时钟
效果如图所示,代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- 剑指 Offer
3.1 找出数组中重复的数 来源:AcWing 题目描述 给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内. 数组中某些数字是重复的,但不知道有几个数字重复了,也不 ...
- $2019$ 暑期刷题记录1:(算法竞赛DP练习)
$ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...
- 《挑战程序设计竞赛》——DFS
DFS(深度优先搜索) 简介 深度优先搜索(DFS,Depth-First Search)是搜索的手段之一.它从某个状态开始,不断的转移状态直到无法转移.然后退回到前一步的状态,继续转移到其他状态,如 ...
- HTML5效果:Canvas 实现圆形进度条并显示数字百分比
实现效果 1.首先创建html代码 <canvas id="canvas" width="500" height="500" styl ...
- AcWing 13. 找出数组中重复的数字
习题地址 https://www.acwing.com/solution/acwing/content/2919/. 题目描述给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 ...
- Acwing 14. 不修改数组找出重复的数字
题目地址 https://www.acwing.com/problem/content/description/15/ 来源:剑指Offer 给定一个长度为 n+1n+1 的数组nums,数组中所有 ...
随机推荐
- netfilter内核态与用户态 通信 之 sockopt
用户态与内核态交互通信的方法不止一种,sockopt是比较方便的一个,写法也简单.缺点就是使用 copy_from_user()/copy_to_user()完成内核和用户的通信, 效率其实不高, 多 ...
- 用GitHub Pages搭建博客(五)
本篇介绍GitHub Pages自定义域名 在用GitHub Pages搭建博客(二)中介绍到,默认的GitHub Pages域名就是仓库地址,即: 账号名.github.io 如果我们要使用自定义域 ...
- python 之路 面向对象
---恢复内容开始--- 一切 万物皆对象. 面向对象其实只是一种编程方式.面向对象式编程可以在很大程度上帮助我们节省时间内存,等问题是我们的代码简单明了. 那么首先定义的格式为class clas ...
- 01 Servlet技术
Servlet 1.Servlet技术 1.1.什么是Servlet Servlet是JavaEE规范之一.规范就是接口 Servlet就JavaWeb三大组件之一.三大组件分别是:Servlet程序 ...
- 测试_QTP简介
一:什么是QTP? QTP(QuickTest Professional)是一款自动化测试工具,自动化测试就是利用计算机模拟人进行测试,也就是开发一套代码测试另一套代码. QTP主要用它来执行重复的手 ...
- NUC972当检测到sd卡时,在sd卡驱动中操作gpio开启sd卡的电源,解决sd卡因低电压有时识别不正常的问题
1.根据硬件原理图,找到对应控制sd卡电源的gpio引脚,并在sd卡驱动文件中定义操作改该引脚的宏 2.在sd卡检测函数中,使用glib增加开sd卡电源的操作,如此当sd卡每次被检测到时,驱动中就会自 ...
- 4.Spring Boot web开发
1.创建一个web模块 (1).创建SpringBoot应用,选中我们需要的模块: (2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来 (3).自己编 ...
- kali 系列学习01 - 安装、vmtools、ssh服务和共享文件夹
Kali介绍Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统.面向专业的渗透测试和安全审计,超过300个渗透测试工具一.安装 1.在虚拟机中安装,详见 https: ...
- Wine和CrossOver之间的关系简单介绍
相信有些小伙伴们不太了解Wine和CrossOver之间的关系与区别,然而对此又很好奇,所以小编今天将给大家介绍一下这两者之间的关系与区别. Wine是什么? Windows.Linux和macOS是 ...
- QQ账号测试用例