【SCOI2009】bzoj1026 windy数

来源:互联网 发布:伊朗 美女 知乎 编辑:程序博客网 时间:2024/06/11 01:55

Description

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

Input

  包含两个整数,A B。

Output

  一个整数

先统计出来f[i][j]表示i位数,首位为j,合法的数的个数。
逐位统计的时候,每一位累加与上一位差满足要求的数。
可以先把位数不到的单独统计,然后强制首位不能为零。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int f[15][10],a[15];int qry(int x){    int i,j,k,len=0,ans=0;    while (x)    {        a[++len]=x%10;        x/=10;    }    for (i=len-1;i;i--)      for (j=1;j<=9;j++)        ans+=f[i][j];    for (i=len;i;i--)    {        if (i==len)          for (j=1;j<a[i];j++)            ans+=f[i][j];        else          for (j=0;j<a[i];j++)          {            if (abs(a[i+1]-j)>=2)              ans+=f[i][j];          }        if (i<len&&abs(a[i+1]-a[i])<2) break;    }    return ans;}int main(){    int i,j,k,m,n,p,q,x,y,z;    for (i=0;i<=9;i++)      f[1][i]=1;    for (i=1;i<=11;i++)      for (j=0;j<=9;j++)        for (k=0;k<=9;k++)          if (abs(j-k)>=2)            f[i][j]+=f[i-1][k];    scanf("%d%d",&m,&n);    printf("%d\n",qry(n+1)-qry(m));}
0 0
原创粉丝点击