BZOJ_1026_[SCOI2009]_windy数_(数位dp)
描述
http://www.lydsy.com/JudgeOnline/problem.php?id=1026
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
分析
我们用\(dp[i][j]\)表示以\(j\)开头的\(i\)为数中windy数一共有多少.
然后用\(solve(x)\)求出\([1,x]\)内的windy数一共有多少,步骤如下:
1.将\(x\)一位一位拆开,共\(cnt\)位,第\(i\)位为\(num[i]\).
2.统计以\(1,2,3,...,9\)开头的\(i\)位数中共有多少windy数,其中\(i<cnt\).
3.对于\(cnt\)位数,显然我们是不能把\(dp[cnt][num[cnt]\)加进去的.比如\(x=5786\),以\(5\)开头的\(4\)位数没有完全包含,所以只能从\(dp[cnt][1]\)计算到\(dp[cnt][num[cnt]-1]\),然后对于第\(cnt\)位为\(num[cnt]\)的,就到\(cnt-1\)位去计算.(相当于数钱,一共5786,数到4999,不能直接数5999,对于>=5000的,要从百位开始数了).
4.依次往后退,但是注意,当\(num[i]\)与\(num[i+1]\)相差不到\(2\)的话,对于第\(i\)位是\(num[i]\)的情况就不需要考虑了,也就不用继续下去了.
5.由于第\(cnt\)位不能取\(0\),而只有最后一位可以去\(num[i]\),比较特殊,所以需要单独处理,可以特判一位数的情况,确保至少有最高位和最低位两个不同的位.
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
int num[];
ll dp[][];
ll a,b;
inline ll read(ll &x){ x=;ll k=-;char c;for(c=getchar();c<''||c>'';c=getchar())if(c=='-')k=-;for(;c>=''&&c<='';c=getchar())x=x*+c-'';return x*k; }
ll solve(int x){
if(x<) return x;
ll ans=; int cnt=;
while(x) num[++cnt]=x%, x/=;
for(int i=;i<cnt;i++) ans+=dp[i][]-dp[i][];
for(int i=;i<num[cnt];i++) ans+=dp[cnt][i];
for(int i=cnt-;i;i--){
for(int j=;j<num[i];j++)if(abs(num[i+]-j)>)
ans+=dp[i][j];
if(i==&&abs(num[i+]-num[i])>) ans++;
if(abs(num[i+]-num[i])<=) break;
}
return ans;
}
int main(){
read(a); read(b);
for(int i=;i<;i++) dp[][i]=;
dp[][]=;
for(int i=;i<=;i++)for(int j=;j<;j++){
for(int k=;k<;k++)if(abs(j-k)>)
dp[i][j]+=dp[i-][k];
dp[i][]+=dp[i][j];
}
printf("%lld\n",solve(b)-solve(a-));
}
1026: [SCOI2009]windy数
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 5441 Solved: 2450
[Submit][Status][Discuss]
Description
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
Input
包含两个整数,A B。
Output
一个整数
Sample Input
1 10
【输入样例二】
25 50
Sample Output
9
【输出样例二】
20
HINT
【数据规模和约定】
100%的数据,满足 1 <= A <= B <= 2000000000 。
Source
BZOJ_1026_[SCOI2009]_windy数_(数位dp)的更多相关文章
- BZOJ_1026_[SCOI2009]windy数_数位DP
BZOJ_1026_[SCOI2009]windy数_数位DP 题意:windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之 ...
- [bzoj1026][SCOI2009]windy数_数位dp
windy数 bzoj-1026 题目大意:求一段区间中的windy数个数. 注释:如果一个数任意相邻两位的差的绝对值都不小于2,这个数就是windy数,没有前导0.$区间边界<=2\cdot ...
- BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP
BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP Description 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺 ...
- bzoj 1026 [SCOI2009]windy数(数位DP)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4550 Solved: 2039[Submit][Sta ...
- bzoj1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8203 Solved: 3687[Submit][Sta ...
- 2018.06.30 BZOJ1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两 ...
- 【BZOJ】1026: [SCOI2009]windy数(数位dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1026 我果然很弱啊... 考虑数位dp.枚举每一位,然后限制下一位即可. 一定要注意啊!在dfs的时 ...
- 1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9016 Solved: 4085[Submit][Sta ...
- 1026. [SCOI2009]windy数【数位DP】
Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? I ...
随机推荐
- C++ 二维数组(双重指针作为函数参数)
本文的学习内容参考:http://blog.csdn.net/yunyun1886358/article/details/5659851 http://blog.csdn.net/xudongdong ...
- asp.net弹出框后页面走样
1.去掉language='javascript' ,问题依旧 2.后面加上Response.Write("<script>document.location=document. ...
- SSD论文优秀句子
1. Nonvolatile memory(e.g., Phase Change Memory) blurs the boundary between memory and storage and i ...
- MySQL基础学习之触发器
查看触发器 SHOW TRIGGER\G 创建触发器 CREATE TRIGGER 触发器名字 BEFORE/AFTER DELETE ON 表名 FOR EACH ROW INSERT INTO 表 ...
- 微调Win8.1这台电脑
从前有个笑话:一位朋友在办公室受到领导教育:“我说小王同志啊,虽然这电脑是你打了报告组织上买给你用的,可是你也不好这么狂妄嘛...”可怜的他只好把图标的名字改为“大家的电脑”. 想必大家已经知道这个笑 ...
- PHP初学留神(三)
星期一进行面试结束后,意味着我的考研日子也结束了,以及我的2013.在好好总结之后还不能停止学习,心想着要把算法继续学下去,还有Linux.不过呢,始终都要记住尼采老师的这句当头棒喝:“不加选择的知识 ...
- struts2,登录功能模块实现
功能: ·UserLogin作为控制登录的Action,校验密码成功后记录session,可以选择记住登陆状态,登陆成功后自动跳转到登陆前的URL: ·UserLogout作为控制登录推出的Actio ...
- 工作流(Workflow)学习---基础知识整理
工作流定义: 工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人与软件系统协作完成. 工 ...
- Codeforces Round #344 (Div. 2) C. Report
Report 题意:给长度为n的序列,操作次数为m:n and m (1 ≤ n, m ≤ 200 000) ,操作分为t r,当t = 1时表示将[1,r]序列按非递减排序,t = 2时表示将序列[ ...
- 【JPA】表达条件查询的关键字
1.通过解析方法名创建查询 框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find.findBy.read.readBy.get.getBy,然后对剩下部分进行解析.并且如果方法的最后一 ...