Codeforces Round #617 (Div. 3) E1String Coloring (easy vers&&E2. String Coloring (hard version)(贪心)

在这里插入图片描述
在这里插入图片描述
题意:给你初始字符串,要你给每个字符涂色,规定不同颜色的相邻字符可以交换,问你存不存在一种涂色方式能使字符串变得有序?
思路:我们按照贪心的思路,如果我前面有比我大的字符在我前面,我不是不肯定要交换,于是可以遍历比我大的字符,看他们在我前面的最大的编号是多少,然后加1.

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+1;
char s[maxn];
int n,mx=0,ans[maxn],Max[maxn];
int main()
{
	scanf("%d",&n);
	scanf("%s",s);
	for(int i=0;i<n;++i)
	{
		int cnt=0;
		for(int j=s[i]+1;j<='z';++j)
		cnt=max(cnt,Max[j]);
		cnt++;
		Max[s[i]]=cnt;
		ans[i]=cnt;
		mx=max(mx,cnt);
	}
	printf("%d\n",mx);
	for(int i=0;i<n;++i) printf("%d ",ans[i]);
}

E1String Coloring (easy version)
题意和思路:和上面差不多,就是把颜色规定了只能有两个,我们把上面的改一下,一旦mx大于2就输出no就行。

#include<bits/stdc++.h>
using namespace std;
const int maxn=200+1;
char s[maxn];
int n,mx=0,ans[maxn],Max[maxn];
int main()
{
	scanf("%d",&n);
	scanf("%s",s);
	for(int i=0;i<n;++i)
	{
		int cnt=0;
		for(int j=s[i]+1;j<='z';++j)
		cnt=max(cnt,Max[j]);
		cnt++;
		Max[s[i]]=cnt;
		ans[i]=cnt;
		mx=max(mx,cnt);
	}
	if(mx>2) puts("NO");
	else {
		puts("YES");
	for(int i=0;i<n;++i) printf("%d",ans[i]-1);
	}
}
发布了70 篇原创文章 · 获赞 0 · 访问量 2437

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104187522
今日推荐