描述


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)的更多相关文章

  1. BZOJ_1026_[SCOI2009]windy数_数位DP

    BZOJ_1026_[SCOI2009]windy数_数位DP 题意:windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之 ...

  2. [bzoj1026][SCOI2009]windy数_数位dp

    windy数 bzoj-1026 题目大意:求一段区间中的windy数个数. 注释:如果一个数任意相邻两位的差的绝对值都不小于2,这个数就是windy数,没有前导0.$区间边界<=2\cdot ...

  3. BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP

    BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP Description 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺 ...

  4. bzoj 1026 [SCOI2009]windy数(数位DP)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4550  Solved: 2039[Submit][Sta ...

  5. bzoj1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8203  Solved: 3687[Submit][Sta ...

  6. 2018.06.30 BZOJ1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两 ...

  7. 【BZOJ】1026: [SCOI2009]windy数(数位dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1026 我果然很弱啊... 考虑数位dp.枚举每一位,然后限制下一位即可. 一定要注意啊!在dfs的时 ...

  8. 1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9016  Solved: 4085[Submit][Sta ...

  9. 1026. [SCOI2009]windy数【数位DP】

    Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? I ...

随机推荐

  1. C++ 二维数组(双重指针作为函数参数)

    本文的学习内容参考:http://blog.csdn.net/yunyun1886358/article/details/5659851 http://blog.csdn.net/xudongdong ...

  2. asp.net弹出框后页面走样

    1.去掉language='javascript' ,问题依旧 2.后面加上Response.Write("<script>document.location=document. ...

  3. SSD论文优秀句子

    1. Nonvolatile memory(e.g., Phase Change Memory) blurs the boundary between memory and storage and i ...

  4. MySQL基础学习之触发器

    查看触发器 SHOW TRIGGER\G 创建触发器 CREATE TRIGGER 触发器名字 BEFORE/AFTER DELETE ON 表名 FOR EACH ROW INSERT INTO 表 ...

  5. 微调Win8.1这台电脑

    从前有个笑话:一位朋友在办公室受到领导教育:“我说小王同志啊,虽然这电脑是你打了报告组织上买给你用的,可是你也不好这么狂妄嘛...”可怜的他只好把图标的名字改为“大家的电脑”. 想必大家已经知道这个笑 ...

  6. PHP初学留神(三)

    星期一进行面试结束后,意味着我的考研日子也结束了,以及我的2013.在好好总结之后还不能停止学习,心想着要把算法继续学下去,还有Linux.不过呢,始终都要记住尼采老师的这句当头棒喝:“不加选择的知识 ...

  7. struts2,登录功能模块实现

    功能: ·UserLogin作为控制登录的Action,校验密码成功后记录session,可以选择记住登陆状态,登陆成功后自动跳转到登陆前的URL: ·UserLogout作为控制登录推出的Actio ...

  8. 工作流(Workflow)学习---基础知识整理

    工作流定义: 工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人与软件系统协作完成. 工 ...

  9. 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时表示将序列[ ...

  10. 【JPA】表达条件查询的关键字

    1.通过解析方法名创建查询 框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find.findBy.read.readBy.get.getBy,然后对剩下部分进行解析.并且如果方法的最后一 ...