CodeForces 490E Restoring Increasing Sequence
2014-11-28 01:27
323 查看
一开始写的很乱,始终无法AC,下定决心推了重写之后才AC。
主要思路就是每个数都是尽可能小的。
就是说,对于每个数,它的?部分的取值是使它大于上一个数的最小值。
对于每个数,我们可以分为以下情况。
(1)是第一个数,此时,所有问号部分取最小值,即如果首位是?,则首位置为1,如果其他位是?,则该位置为0;
(2)长度比第一个数小,此时必然不满足条件,输出NO;
(3)长度比第一个数大,此时类似第一种情况,所有问号部分取最小值;
(4)等长;
我们可以先找出这个数所有可能值的最小值和最大值。如果最小值比上一个数大,则所有问号部分取最小值。如果最大值小于等于上一个数,则不可能成立,直接输出NO;接下来的情况是这个数必然存在的,我们可以这样做,从头开始与上一个数比对,如果是?,则将这个问号位置的值置为上一个数该位置的值,如果不是问号,如果前后两个相等,则continue,如果当前数大,则将后面的位置置为最小值,如果当前数小,则将后面的?置为最小值,前面的问号,我们可以先将它们都存出来,比如说前面问号现在的值分别为1,2,4;我们可以用一个数tmp=124,再++tmp;然后再将tmp的每一位存回每个问号的位置。
感觉代码还是冗余了些。
主要思路就是每个数都是尽可能小的。
就是说,对于每个数,它的?部分的取值是使它大于上一个数的最小值。
对于每个数,我们可以分为以下情况。
(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; }
相关文章推荐
- Codeforces 20C Dijkstra?
- Bag of mice(CodeForces 148D )
- Codeforces 653A Bear and Three Balls【水题】
- Codeforces 711E. ZS and The Birthday Paradox
- CodeForces - 698B Fix a Tree(并查集)
- Codeforces 842 A Kirill And The Game
- Codeforces 935E Fafa and Ancient Mathematics DP
- CodeForces 25E Test KMP
- [Codeforces 460E][SCOI 2015集训]Roland and Rose(暴力乱搞)
- CodeForces 320B Ping-Pong (Easy Version)-DFS
- CodeForces 708B Recover the String
- [最短路 主席树 Hash] Codeforces 464E #265 (Div. 1) E. The Classic Problem
- CodeForces 96 A.Football(水~)
- Codeforces 914E Palindromes in a Tree 点分治
- codeforces 164 Div2 B
- Codeforces 490C Hacking Cypher(暴力)
- Codeforces 653D Delivery Bears【二分+网络流】
- Codeforces刷题之路——41A Translation
- codeforces 785c[补]
- Codeforces 849 C From Y to Y