模拟习题

CF1333D Challenges in school №41

链接:https://codeforces.com/contest/1333/problem/D

题意:给定由一个 L、R 组成的长度为 n 的字符串, L、R 表示学生面对当前的方向。如果存在 R 和 L 相邻(即两个学生相向),那么学生可以转向。问能否让学生恰好转动 k 次,输出转向的方案。 ( 1 ≤ n ≤ 3000 , 1 ≤ k ≤ 3 × 1 0 6 ) (1\le n \le 3000 ,1\le k\le 3 \times 10^6) 1n3000,1k3×106

思路:用 vector 存下所有学生一起转向的位置。然后将这些位置拆分成 k 次输出

实现:拆分成 k 次输出时,维护当前已经输出的个数 now。判断当前第 i 行是否输出,只需判断: n o w + 1 + c n t − i + 1 ≤ k now + 1 + cnt - i + 1 \le k now+1+cnti+1k 。如果满足那么就是可以输出的。

#include <bits/stdc++.h>
#define ll long long 
using namespace std;
const int maxn=2e5+10;
int n,k;
vector<int> vec[maxn];
string s;
int main()
{
	scanf("%d%d",&n,&k);
	cin>>s;
	s="0"+s;
	int cnt=0;
	ll sum=0;
	while(1)
	{
		bool valid=false;
		cnt++;
		for(int i=1;i<n;++i)
		{
			if(s[i]=='R'&&s[i+1]=='L')
			{
				vec[cnt].push_back(i);
				swap(s[i],s[i+1]);
				i++;
				valid=true;				
			}
		}
		if(!valid)
			break;
		sum+=vec[cnt].size();
	}
	if(vec[cnt].size()==0)
		cnt--;
	
	if(k<cnt||k>sum)
	{
		puts("-1");
		return 0;
	}
	for(int i=1;i<=cnt;++i)
	{
		int p=0,len=vec[i].size();
		while(p<len&&k>cnt-i+1)
		{
			printf("1 %d\n",vec[i][p]);
			p++;
			k--;
		}
		if(p<len)
		{
			printf("%d ",len-p);
			for(int j=p;j<len;++j)	
				printf("%d%c",vec[i][j],j==len-1?'\n':' ');
			k--;
		}
	}	
//	  写法二
//    int now=0;
//    for(int i=1; i<=cnt; ++i)
//    {
//        int m=vec[i].size();
//        for(int j=0; j<m; ++j)
//        {
//            if(j!=m-1)
//            {
//                if(now+1+cnt-i+1<=k)
//                {
//                    printf("1 %d\n",vec[i][j]);
//                    now++;
//                }
//                else
//                {
//                    printf("%d",m-1-j+1);
//                    while(j<m)
//                    {
//                        printf(" %d",vec[i][j]);
//                        j++;
//                    }
//                    puts("");
//                    now++;
//                }
//            }
//            else printf("1 %d\n",vec[i][j]),now++;
//        }
//    }
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值