bzoj1026: [SCOI2009]windy数
来源:互联网 发布:java生成二维数组 编辑:程序博客网 时间:2024/06/06 02:38
Description
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
Input
包含两个整数,A B。
Output
一个整数
Sample Input
【输入样例一】
1 10
【输入样例二】
25 50Sample Output
【输出样例一】
9
【输出样例二】
20HINT
【数据规模和约定】
100%的数据,满足 1 <= A <= B <= 2000000000 。
题解:
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
包含两个整数,A B。
一个整数
1 10
【输入样例二】
25 50
9
【输出样例二】
20
【数据规模和约定】
100%的数据,满足 1 <= A <= B <= 2000000000 。
数位DP,令f[i][j]为i位数,开头为j的windy数的个数,方程f[i][k]=∑f[i-1][j](abs(k-j)>=2)
#include <cstdio>#include <cstring>using namespace std;int base[20];int num[20][20];inline int abs(int x){ return x<0?-x:x;}inline void dp(){ base[1]=1; for(int i=2;i<=10;i++) base[i]=base[i-1]*10; for(int i=0;i<=9;i++) num[1][i]=1; for(int i=2;i<=10;i++) for(int j=0;j<=9;j++) for(int k=0;k<=9;k++) if(abs(k-j)>=2) num[i][k]+=num[i-1][j];}inline int get(int x){ if(!x) return 0; int cnt=10; while(base[cnt]>x) cnt--; int ans=0; int t=x/base[cnt]; for(int i=1;i<t;i++) ans+=num[cnt][i]; for(int i=1;i<cnt;i++) for(int j=1;j<=9;j++) ans+=num[i][j]; int pre=t; x%=base[cnt]; cnt--; for(int i=cnt;i>=1;i--){ t=x/base[i]; if(i!=1){ for(int j=0;j<t;j++) if(abs(j-pre)>=2) ans+=num[i][j]; } else for(int j=0;j<=t;j++) if(abs(j-pre)>=2) ans+=num[i][j]; if(abs(t-pre)<2) break; pre=t; x%=base[i]; } return ans;}int main(){ //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); int l,r; scanf("%d %d",&l,&r); dp(); int v=get(l-1); printf("%d\n",get(r)-get(l-1));return 0;}
阅读全文
0 0
- [BZOJ1026][SCOI2009]windy数
- [bzoj1026][SCOI2009]windy数
- 【SCOI2009】【BZOJ1026】windy数
- [BZOJ1026][SCOI2009]windy数
- bzoj1026【SCOI2009】windy数
- BZOJ1026 [SCOI2009] windy数
- 【bzoj1026】[SCOI2009]windy数
- 【SCOI2009】bzoj1026 windy数
- [bzoj1026]: [SCOI2009]windy数
- bzoj1026 [SCOI2009]windy数
- bzoj1026: [SCOI2009]windy数
- bzoj1026 [SCOI2009]windy数
- BZOJ1026: [SCOI2009]windy数
- bzoj1026: [SCOI2009]windy数
- [BZOJ1026][SCOI2009]windy数
- 【bzoj1026】[SCOI2009]windy数
- bzoj1026: [SCOI2009]windy数
- bzoj1026 [SCOI2009]windy数
- Missing artifact jdk.tools:jdk.tools:jar:1.8
- 多线程 Callable Runnable 与Future
- 基于 SquashFS 构建 Linux 可读写文件系统
- 浅析 Linux 初始化 init 系统 systemd
- bzoj3172: [Tjoi2013]单词
- bzoj1026: [SCOI2009]windy数
- C的小项目:注释转换
- 为什么spinlock需要提升IRQL到Dispatch Level?
- 三十分钟理解:双调排序Bitonic Sort,适合并行计算的排序算法
- gcc链接参数
- 通过程序设计几何图形(Shape)、矩形(Rectangle)、圆形(Circle)、正方形(Square)几种类型, 能够利用接口和多态性计算几何图形的面积和周长并显示。
- 2、按以下要求编写程序 (1) 编写Animal接口,接口中声明run() 方法 (2) 定义Bird类和Fish类实现Animal接口 (3) 编写Bird类和Fish类的测试程序,并调用其
- 1、利用String类或StringBuffer类的方法,对输入的Email地址进行有效性验证。提示:1)Email地址中应包含“@”和“.”符号;2)“@”
- (简单思维)HihoCoder