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--;
			   }
	   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值