bzoj 1026 [SCOI2009]windy数

来源:互联网 发布:js 鼠标离开div隐藏 编辑:程序博客网 时间:2024/04/20 03:53

辣鸡蒟蒻我的一点尝试
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 分析了好久还是都是细节没有注意到

题目中给的范围大概在2*10^9左右 显然这题是无法线性解决的 那么我们考虑 因为他和数是多少没有关系 而是和这个数中 每个数字互相之间的大小关系有关 那么我们一位一位来考虑 设f[i][j]表示 我的数字长为i 然后最高位为j 我的windy数一共有多少 那么显然可以看出来这个转移就是 f[i][j]=sigma(f[i-1][k])k=0~9 &&abs(k-j)>=2 然后首先我先预处理出前10位的这个数组 然后采取类似前缀的思想 比如l~r这个区间 那显然我就是1~r区间的windy数-1~l-1区间的windy数的个数

如果直接累加的话 显然很容易超出边界 那怎么办 我首先可以假设这个数一共是k位 然后那么位数

#include<cstdio>#include<cstring>#define ll long longll f[12][12];int num[12],l,r;inline ll abs(ll a){    if (a>0) return a;else return -a;}inline ll calc(int x){    int k=0;memset(num,0,sizeof(num));ll ans=0;    while(x) num[++k]=x%10,x/=10;    for (int i=1;i<k;++i) for (int j=1;j<=9;++j) ans+=f[i][j];    for (int j=1;j<num[k];++j) ans+=f[k][j];    for (int i=k-1;i>=1;--i){        for (int j=0;j<num[i];++j) if (abs(num[i+1]-j)>=2) ans+=f[i][j];        if (abs(num[i+1]-num[i])<2) break;if (i==1) ans++;    }return ans;}int main(){//  freopen("bzoj1026.in","r",stdin);    scanf("%d%d",&l,&r);    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 z=0;z<=9;++z) if (abs(j-z)>=2) f[i][j]+=f[i-1][z];    printf("%lld\n",calc(r)-calc(l-1));    return 0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魔仙堡口音 东北口音对白 山东口音爸爸女儿拍摄16分 东北口音特点 闭口音唱高音怎么唱 一个有东北口音的杯子 东北口音 对白 锦州口音质疑了全世界 纠正普通话口音的app 如何矫正口音练好标准普通话 雅思听力印度口音 一分钟学北京口音 南方人说普通话口音重 老师上课时的奇妙口音 唱歌开口音和闭口音怎么发声 抖音很火的一首广西口音的歌 背诵早发白帝城用什么口音 我像风一样自由抖音广西口音 一口香腊汁肉夹馍 内蒙麻将一口香 口香 星悦内蒙麻将一口香 口麦 口麦读什么 一个口一个麦念什么 一个口一个麦 印度桑妮黎翁重口图片 口齿 口齿清晰 口齿什么字 口齿便给 口齿读什么 口齿念什么 口齿怎么读 口齿不清如何矫正 古言 古阿 古琓 月下吟古武狂兵 古希腊之地中海霸主