CodeForces 490E Restoring Increasing Sequence

来源:互联网 发布:明星变脸软件是什么 编辑:程序博客网 时间:2024/05/16 06:57

一开始写的很乱,始终无法AC,下定决心推了重写之后才AC。

主要思路就是每个数都是尽可能小的。

就是说,对于每个数,它的?部分的取值是使它大于上一个数的最小值。

对于每个数,我们可以分为以下情况。

(1)是第一个数,此时,所有问号部分取最小值,即如果首位是?,则首位置为1,如果其他位是?,则该位置为0;

(2)长度比第一个数小,此时必然不满足条件,输出NO;

(3)长度比第一个数大,此时类似第一种情况,所有问号部分取最小值;

(4)等长;

我们可以先找出这个数所有可能值的最小值和最大值。如果最小值比上一个数大,则所有问号部分取最小值。如果最大值小于等于上一个数,则不可能成立,直接输出NO;接下来的情况是这个数必然存在的,我们可以这样做,从头开始与上一个数比对,如果是?,则将这个问号位置的值置为上一个数该位置的值,如果不是问号,如果前后两个相等,则continue,如果当前数大,则将后面的位置置为最小值,如果当前数小,则将后面的?置为最小值,前面的问号,我们可以先将它们都存出来,比如说前面问号现在的值分别为1,2,4;我们可以用一个数tmp=124,再++tmp;然后再将tmp的每一位存回每个问号的位置。

感觉代码还是冗余了些。

/*************************************************************************> File Name: new.cpp> Author: sadbb> Created Time: 五 11/28 00:28:22 2014 ************************************************************************/#include <cstdio>#include <cstring>int ans[100100];int min,max;int ishasproblem[100100];int ha[100100];char input[100100][10];void change(char *a,int len){for(int i=0;i<len;++i){if(a[i]=='?'){if(i==0){a[i]='1';}else {a[i]='0';}}}}void input2ans(char *input,int &ans,int len){ans=0;for(int i=0;i<len;++i){ans*=10;ans+=input[i]-'0';}}int main(){int n;scanf("%d",&n);for(int i=0;i<n;++i){scanf("%s",input[i]);int size=(int)strlen(input[i]);ans[i]=0;for(int j=0;j<size;++j){if(input[i][j]=='?'){ishasproblem[i]=1;ans[i]=0;break;}ans[i]*=10;ans[i]+=input[i][j]-'0';}}for(int i=0;i<n;++i){if(i==0&&ishasproblem[i]){int size=(int)strlen(input[i]);change(input[i],size);            //printf("%s\n",input[i]);input2ans(input[i],ans[i],size);            //printf("%d\n",ans[i]);continue;}else if(i!=0&&!ishasproblem[i]){if(ans[i]<=ans[i-1]){printf("NO\n");return 0;}}else if(ishasproblem[i]){int size=(int)strlen(input[i]);int size_old=(int)strlen(input[i-1]);if(size<size_old){printf("NO\n");return 0;}else if(size>size_old){change(input[i],size);input2ans(input[i],ans[i],size);}else {min=0,max=0;for(int j=0;j<size;++j){min*=10;max*=10;if(input[i][j]=='?'){if(j==0){min+=1;}max+=9;}else{min+=input[i][j]-'0';max+=input[i][j]-'0';}}if(max<=ans[i-1]){printf("NO\n");return 0;}if(min>ans[i-1]){ans[i]=min;change(input[i],size);continue;}int tmp=0;int flag_point[10];int cnt=0;int ok=0;for(int j=0;j<size;++j){if(input[i][j]=='?'){input[i][j]=input[i-1][j];tmp*=10;tmp+=input[i][j]-'0';flag_point[cnt]=j;++cnt;}else if(input[i][j]>input[i-1][j]){for(int k=j;k<size;++k){if(input[i][k]=='?'){if(k==0){input[i][k]='1';}else{input[i][k]='0';}}}input2ans(input[i],ans[i],size);ok=1;break;}else if(input[i][j]<input[i-1][j]){for(int k=j;k<size;++k){if(input[i][k]=='?'){if(k==0){input[i][k]='1';}else input[i][k]='0';}}++tmp;for(int k=cnt-1;k>=0;--k){input[i][flag_point[k]]=tmp%10+'0';tmp/=10;}input2ans(input[i],ans[i],size);ok=1;break;}}if(!ok){++tmp;for(int k=cnt-1;k>=0;--k){input[i][flag_point[k]]=tmp%10+'0';tmp/=10;}input2ans(input[i],ans[i],size);}}}}printf("YES\n");for(int i=0;i<n;++i){printf("%d\n",ans[i]);}return 0;}

0 0
原创粉丝点击