「BZOJ1026」[SCOI2009] windy数
Description
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?
Input
包含两个整数,A B。
Output
一个整数。
Sample Input
「输入样例一」
1 10
「输入样例二」
25 50
1 10
「输入样例二」
25 50
Sample Output
「输出样例一」
9
「输出样例二」
20
「数据规模和约定」
20%的数据,满足 1 <= A <= B <= 1000000 。
100%的数据,满足 1 <= A <= B <= 2000000000 。
9
「输出样例二」
20
「数据规模和约定」
20%的数据,满足 1 <= A <= B <= 1000000 。
100%的数据,满足 1 <= A <= B <= 2000000000 。
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<cmath> #define inf 0x7fffffff #define ll long long using namespace std; inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int f[15][15],base[15]; int A,B; void ini() { base[1]=1; for(int i=2;i<=10;i++) base[i]=base[i-1]*10; A=read();B=read(); for(int i=0;i<=9;i++)f[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(j-k)>=2)f[i][j]+=f[i-1][k]; } int cnt(int n) { if(!n)return 0; int tmp=0,w=10; while(base[w]>n)w--; for(int i=1;i<w;i++) for(int j=1;j<=9;j++) tmp+=f[i][j]; int cur=n/base[w]; for(int i=1;i<cur;i++)tmp+=f[w][i]; n%=base[w]; int pre=cur; for(int i=w-1;i;i--) { cur=n/base[i]; if(i!=1) { for(int j=0;j<cur;j++) if(abs(pre-j)>=2)tmp+=f[i][j]; } else { for(int j=0;j<=cur;j++) if(abs(pre-j)>=2)tmp+=f[i][j]; } if(abs(cur-pre)<2)break; pre=cur; n%=base[i]; } return tmp; } int main() { ini(); printf("%d",cnt(B)-cnt(A-1)); return 0; } |
这个代码怎么连样例都没有过啊
小数据貌似会比正解大1?
貌似1 9这个程序就过不了?