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 好数(模拟)的主要内容,如果未能解决你的问题,请参考以下文章

2017.12.09NOIP提高组模拟赛A组

2017.07.11NOIP提高组模拟赛B组

2018.8.10提高B组模拟考试

2018.8.7提高B组模拟考试

2017.07.14NOIP提高组模拟赛B组

2017.07.09NOIP提高组模拟赛B组