社区讨论

90分求调

P2657[SCOI2009] windy 数参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo8m6s3n
此快照首次捕获于
2023/10/27 20:53
2 年前
此快照最后确认于
2023/10/27 20:53
2 年前
查看原帖
CPP
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int a,b;
int f[11][11];
int work(int x){
    if(!x)return 1;
    int a[11]={},cnt=0;
    while(x)a[++cnt]=x%10,x/=10;
    int ans=0;
    for(int i=1;i<cnt;i++){
        for(int j=1;j<=9;j++)ans+=f[i][j];
    }
    for(int i=1;i<a[cnt];i++)ans+=f[cnt][i];
    for(int i=cnt-1;i>=1;i--){
        for(int j=0;j<a[i];j++){
            if(abs(a[i+1]-j)>=2)ans+=f[i][j];
        }
        if(abs(a[i+1]-a[i])<2)break;
    }
    return ans;
}
void init(){
    for(int i=0;i<=9;i++)f[1][i]=1;
    for(int i=2;i<=9;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 main()
{
    init();
    cin>>a>>b;
    cout<<work(b+1)-work(a);
}

回复

4 条回复,欢迎继续交流。

正在加载回复...