您的位置:首页 > 产品设计 > UI/UE

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的每一位存回每个问号的位置。

感觉代码还是冗余了些。

/*************************************************************************
> 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: