【BZOJ 1026】 [SCOI2009]windy数
2016-02-27 08:32
295 查看
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 。
数位DP,f[i][j]表示一共有i位最高位为j共有多少个符合条件的值
#include<cstdio> #include<cmath> using namespace std; int base[11],f[11][11],a,b; void pre(){ base[1]=1; for(int i=2;i<=10;i++) base[i]=base[i-1]*10;//base代表这一位有多少数字 for(int i=0;i<=9;i++)f[1][i]=1;//f[i][j]代表有i位第一位为j的有多少个 for(int i=2;i<=10;i++) for(int j=0;j<=9;j++) for(int k=0;k<=9;k++) if(fabs(j-k)>=2) f[i][j]+=f[i-1][k]; } int calc(int x){ if(!x) return 0; int w=10,ans=0; while(base[w]>x)w--; int cur=x/base[w];//x的第一位 for(int i=1;i<w;i++) for(int j=1;j<=9;j++) ans+=f[i][j];//why? for(int i=1;i<cur;i++) ans+=f[w][i]; x%=base[w]; int pre=cur; for(int i=w-1;i;i--){ cur=x/base[i]; if(i>1){ for(int j=0;j<cur;j++)if(fabs(j-pre)>=2) ans+=f[i][j]; } else{ for(int j=0;j<=cur;j++) if(fabs(j-pre)>=2) ans+=f[i][j]; } if(fabs(cur-pre)<2) break; x%=base[i]; pre=cur; } return ans; } int main(){ scanf("%d%d",&a,&b); pre(); printf("%d",calc(b)-calc(a-1)); }
相关文章推荐
- http协议
- 同步内核缓冲区 sync、fsync和fdatasync函数
- 阿里云服务器Web项目配置发布全过程(二)
- 图书馆管理系统
- UNIX系统基本结构
- 【BZOJ 1188】 [HNOI2007]分裂游戏
- 深入理解OOP-java版本
- SQL SERVER系统存储过程
- android.os.Build
- 动态规划简述-leetcode dynampic programming
- 些许作业
- nodejs + nginx + redis cluster 高并发解决方案
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(2月27日)
- VS2015 调试时 编辑并继续不可用
- iOS将时间转化为时间戳
- Delphi的TListView控件拖放选定行操作
- lintcode-easy-Maximum Subarray
- 【BZOJ3132】上帝造题的七分钟
- 3d中的坐标系的概念
- 第一次说外语