Codeforces Round #632 (Div. 2) D. Challenges in school №41(构造)

题目链接
在这里插入图片描述
在这里插入图片描述
题意:有一个由L和R组成的字符,每一轮你都可以将RL变化成LR,问你能否刚好经过k轮把字符串变成左边都是L,右边都是R。
思路:暴力构造就行,我们可以算出构造出这样的字符串的最小步骤和最大步骤的,只要k在这个范围内就肯定能构造出来。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e3+5;
vector<int>ans[maxn];
char s[maxn];
int main()
{
	int n,k,cnt=0,sum=0;
	scanf("%d %d",&n,&k);
   	scanf("%s",s+1);
   	while(1)
   	{
   		int flag=0;
   		cnt++;
   		for(int i=1;i<n;++i)
   		{
   			if(s[i]=='R'&&s[i+1]=='L') flag=1,ans[cnt].push_back(i);
		   }
		   if(!flag) break;
		   for(int i:ans[cnt]) swap(s[i],s[i+1]);
		   sum+=ans[cnt].size();
	   }
	   if(k<cnt-1||k>sum){
	   	printf("-1\n");return 0;
	   }
	   for(int i=1;i<cnt;++i)
	   {
	   		while(!ans[i].empty()&&k>cnt-i)
	   		{
	   			printf("1 ");
	   			printf("%d\n",ans[i].back());
	   			ans[i].pop_back();
	   			k--;
			   }
			   if(!ans[i].empty())
			   {
			   	printf("%d ",ans[i].size());
			   	for(int j:ans[i]) printf("%d ",j);
			   	printf("\n");
			   	k--;
			   }
	   }
}
发布了391 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

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