2021.7.21提高B组模拟8T1 好数(模拟)
Posted SSL_LKJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021.7.21提高B组模拟8T1 好数(模拟)相关的知识,希望对你有一定的参考价值。
好数
题目大意
输入样例
1.
700
0
2.
700
1
输出样例
1.
777
2.
700
题目数据
解题思路
这题就是按照它的一步一步模拟
其实可以分类讨论
首先是 k=0
这个很好推
然后是 k=1
可以自己摸索一下
提供几个易错的样例
1.输入样例
62814
0
1.输出样例
66666
2.输入样例
112
0
2.输出样例
222
3.输入样例
99002
0
3.输出样例
99999
4.输入样例
55549
1
4.输出样例
55550
AC代码
我的处理方式和大家的可能不大一样,望大家能各自摸索
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char s[20],ans1[20],ans2[20];
int k,sum[10];
int main()
{
scanf("%s",&s);
int len=strlen(s);
scanf("%d",&k);
if(len==1){printf("%s",s);return 0;}//特判
if(!k)//分类讨论
{
int ok=1;
for(int i=1;i<len;i++)//比较大小
{
if(s[0]==s[i])continue;
if(s[i]<s[0])ok=1;
else ok=0;
break;
}
if(ok)
for(int i=0;i<len;i++)printf("%c",s[0]);//全为头
if(!ok)
for(int i=0;i<len;i++)printf("%c",char(int(s[0])+1));//全为头+1
}
else
{
int mmax=0;
for(int i=0;i<len;i++)
{
sum[s[i]-48]++;
mmax=max(sum[s[i]-48],mmax);
}
if(mmax>=len-1)//特判
{
printf("%s",s);
}
else
{
int o=0;
for(int i=1;i<len;i++)
if(s[i]!=s[i-1]){o=i;break;}
if(o==1)//分类讨论
{
while(1)
{
for(int i=2;i<len;i++)
ans1[i]=s[0];
int ok1=1;
for(int i=2;i<len;i++)
{
if(ans1[i]==s[i])continue;
if(ans1[i]<s[i])ok1=0;
else ok1=1;
break;
}
for(int i=2;i<len;i++)
ans2[i]=s[1];
int ok2=1;
for(int i=2;i<len;i++)
{
if(ans2[i]==s[i])continue;
if(ans2[i]<s[i])ok2=0;
else ok2=1;
break;
}
if(ok1&&ok2)
{
int ok3=0;
for(int i=2;i<len;i++)
{
if(ans1[i]==ans2[i])continue;
if(ans1[i]<ans2[i])ok3=1;
else ok3=0;
break;
}
if(ok3)
{
printf("%c%c",s[0],s[1]);
for(int i=2;i<len;i++)
printf("%c",ans1[i]);
return 0;
}
else
{
printf("%c%c",s[0],s[1]);
for(int i=2;i<len;i++)
printf("%c",ans2[i]);
return 0;
}
}
else
{
if(ok1)
{
printf("%c%c",s[0],s[1]);
for(int i=2;i<len;i++)
printf("%c",ans1[i]);
return 0;
}
if(ok2)
{
printf("%c%c",s[0],s[1]);
for(int i=2;i<len;i++)
printf("%c",ans2[i]);
return 0;
}
}
s[1]=char(int(s[1])+1);
for(int i=2;i<len;i++)
s[i]=0;
}
}
else
{
for(int i=o+1;i<len;i++)
ans1[i]=s[0];
int ok1=1;
for(int i=o+1;i<len;i++)
{
if(ans1[i]==s[i])continue;
if(ans1[i]<s[i])ok1=0;
else ok1=1;
break;
}
if(ok1)
{
for(int i=0;i<=o;i++)
printf("%c",s[i]);
for(int i=o+1;i<len;i++)
printf("%c",ans1[i]);
}
else
{
if(s[o]<'9')
{
if(o!=len-2)
{
for(int i=0;i<o;i++)
printf("%c",s[i]);
printf("%c",char(int(s[o])+1));
for(int i=o+1;i<len;i++)
printf("%c",s[0]);
}
else
{
for(int i=0;i<o;i++)
printf("%c",s[i]);
printf("%c",char(int(s[o])+1));
for(int i=o+1;i<len;i++)
printf("0");
}
}
else
{
for(int i=0;i<o-1;i++)
printf("%c",s[i]);
printf("%c",char(int(s[o-1]))+1);
for(int i=o;i<len;i++)
printf("%c",s[0]);
}
}
}
}
}
return 0;
}
谢谢
以上是关于2021.7.21提高B组模拟8T1 好数(模拟)的主要内容,如果未能解决你的问题,请参考以下文章