CodeForces 490E Restoring Increasing Sequence

来源:互联网 发布:php微信答题 源码 编辑:程序博客网 时间:2024/05/16 08:07



点击打开链接



题意:

给以一个升序的序列,但是里面有的数有些位是问号,

问你合不合法,若合法,给出最小的数列。


题解:  

本来写两个for,一直wa到 test 6.。。。。然后举不出反例。

后来改成用dfs从前往后递推。就ac了。

从前往后,找到有问号的数,先让它等于上一位,向后遍历,不行+1;

之后所有的数全部变成0,或者1。

所以?->   a[i-1][j] -9 or 1 or 0;



#include<bits/stdc++.h>#define ll long long#define x first#define y secondusing namespace std;const int inf=0xffffff;const int mod=997;const int maxn=1e5+100;char a[maxn][10];bool dfs(char *a,char *b,int pos,int len){    if(pos>=len) return false;    if(a[pos]=='?'){        a[pos]=b[pos];        if(dfs(a,b,pos+1,len)) return true;        if(a[pos]!='9'){            a[pos]++;            return true;        }        a[pos]='?';        return false;    }else{        if(a[pos]==b[pos]) dfs(a,b,pos+1,len);        else return a[pos]>b[pos];    }}int main(){    int n;    scanf("%d",&n);    a[0][0]='0';    a[0][1]='\0';    int lenb=1,lena,f=1;    for(int i=1;i<=n;++i)        scanf("%s",a[i]);    for(int i=1;i<=n;++i){        lena=strlen(a[i]);        if(lena<lenb){            f=0;break;        }else if(lena==lenb){            if(!dfs(a[i],a[i-1],0,lena)){                f=0;break;            }        }        for(int j=0;j<lena;++j){            if(a[i][j]=='?'){                if(j) a[i][j]='0';                else  a[i][j]='1';            }        }lenb=lena;    }    if(f){        puts("YES");        for(int i=1;i<=n;++i)            puts(a[i]);    }else puts("NO");    return 0;}


原创粉丝点击