首页 > 其他分享 >洛谷 P3615 如厕计划

洛谷 P3615 如厕计划

时间:2025-01-09 20:01:08浏览次数:1  
标签:std 洛谷 后缀 max sum 如厕 P3615 男生 匹配

题意:2n个人排队上厕所,有两个厕所,一个男女都可以上,一个只有女的可以上,每个人上厕所都只有一分钟,你可以调整这些人的顺序,每个的怒气值为有多少后面的人排到自己前面了。求可以n分钟上完厕所的情况中,怒气最大的最小。

这题看半天没思路,只能看题解。
首先厕所一分钟都不能停,要么男女一起上两个厕所,要么女女一起,发现女生随意和谁匹配,考虑怎样满足男生的匹配。如果从前往后模拟看的话,我们遇到男生后面找不到女生的情况,就无从下手,因为前面的都已经匹配了。我们可以从后往前看,有一个规则就是男的不能比女的多两个以上,这个后缀开头一定是男生(如果不是往后找一定有),因为如果多一个,这个男生还可以和前面的女生匹配;但多了两个的话,如果和前面匹配掉一个,剩下还是多一个男生,但他已经不能和前面匹配了。如果和后面的匹配,就跟不行了,因为本来女生就少了。
所以记录后缀和,男生为1,女生为-1,如果当前位置后缀和为x,那么我们需要移走x - 1个男生,留下一个男生可以和前面匹配(如果有解一定可以匹配),那么有x-1个移到前面去了,就有人有x - 1的怒气值,所有情况求最大值即可(因为这样操作已经最优了,我们要求最大的最小,也就是每个后缀的最优解中最大的)。
还有一个问题是他的输入意思时一段复制多份然后连起来,因为数据太大我们无法还原字符串,但每个位置后面的后缀和还是可以算的,那么我们只要求这个段里最大后缀值就行了,如果这段的一份的值总和大于0,那么可以假设k-1份,剩下一份我们单独对这个一份字符串求个最大后缀,然后加起来,这就是这个段可以拼出的最大后缀。如果小于0,直接加上最大后缀就行了。

点击查看代码
void solve() {
	i64 n, m;
	std::cin >> n >> m;
	std::string s;
	std::vector<i64> sum(m), max(m), k(m);
	for (int i = 0; i < m; ++ i) {
		std::string t;
		std::cin >> t >> k[i];
		for (int j = (int)t.size() - 1; j >= 0; -- j) {
			sum[i] += t[j] == 'M' ? 1 : -1;
			max[i] = std::max(max[i], sum[i]);
		}
	}

	i64 tot = 0, ans = 0;
	for (int i = m - 1; i >= 0; -- i) {
		if (sum[i] > 0) {
			ans = std::max(ans, tot + (k[i] - 1) * sum[i] + max[i] - 1);
		} else {
			ans = std::max(ans, tot + max[i] - 1);
		}

		tot += sum[i] * k[i];
	}

	if (tot >= 2) {
		std::cout << -1 << "\n";
	} else {
		std::cout << ans << "\n";
	}
}

标签:std,洛谷,后缀,max,sum,如厕,P3615,男生,匹配
From: https://www.cnblogs.com/maburb/p/18662813

相关文章

  • 洛谷 P1928 外星密码
    好久不见,随便找一题找找感觉。递归写法:#include<bits/stdc++.h>usingnamespacestd;strings;stringtimes(stringx,intcnt){ stringnewstr=""; while(cnt--)newstr+=x; returnnewstr;}pair<string,int>decompress(intpos){ intnum=0; stringte......
  • 洛谷 P2754 [CTSC1999] 家园 / 星际转移问题——题解
    #ifdefONLINE_JUDGE#else#defineQiu_Cheng#endif#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;//typedeflonglongll;constintN=2e6+5,mod=1e9+7,inf=INT_MAX;//constintmod1=469762049,mod2=998244353,mod3=1004535......
  • 洛谷 P1550 [USACO08OCT] Watering Hole G 题解
     由于无法提交题解所以来csdn蹭个位置  题目链接  这道题我的思路就是用并查集(推荐先学习:并查集(B站视频))将所有农场连接成n个(几个都不重要)连通块,用一个优先队列(由于作者没找视频所以不放链接了sorry)记录x农场连接y农场的最小价格。  有个值......
  • 洛谷题单指南-线段树的进阶用法-P4093 [HEOI2016/TJOI2016] 序列
    原题链接:https://www.luogu.com.cn/problem/P4093题意解读:一个序列,m个变化,求任意一个变化后不受影响的最长上升子序列长度。解题思路:设原序列为a[N],原序列经过变化后能得到的最大值序列为maxa[N],最小值序列为mina[N]设f[i]表示以第i个数结尾的最长不降子序列长度有f[i]=max......
  • 洛谷P2670 [NOIP2015 普及组] 扫雷游戏
    一、原理此代码旨在解决扫雷游戏中根据给定的雷区地雷分布情况,计算出每个非地雷格周围的地雷数量,并输出完整雷区信息的问题。核心原理是通过遍历二维的雷区表示数组,针对每个非地雷格,检查其周围八个方向(上、下、左、右、左上、右上、左下、右下)上的格子是否为地雷格(以 * 表示......
  • 每日一题洛谷B3655 [语言月赛202208] 天天爱跑步C语言
    #include<stdio.h>intmain(){ intn; scanf("%d",&n); intv1,v3,v7,v30,v120,v365; scanf("%d%d%d%d%d%d",&v1,&v3,&v7,&v30,&v120,&v365); intt=0; intcount=0; intsum=0; for......
  • 2025.1 洛谷月赛选练
    众所周知,洛谷月赛的题目质量其实是很高的。会不了一点。应该只会做绿及以上。紫及以上会标上[HardProblem]的标签。题目选自洛谷2023官方题单(1-4月)P8941[DTOI2023]D.Goodbye2022P8966觅光|SearchingforHope(easyver.)P8967追寻|PursuitofDream[HardP......
  • gesp(C++四级)(1)洛谷:B3939:[GESP样题 四级] 绝对素
    gesp(C++四级)(1)洛谷:B3939:[GESP样题四级]绝对素数题目描述如果一个两位数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如131313。给定两个正整数......
  • gesp(C++四级)(2)洛谷:B3940:[GESP样题 四级] 填幻方
    gesp(C++四级)(2)洛谷:B3940:[GESP样题四级]填幻方题目描述在一个N×NN\timesNN×N的正方形网格中,每个格......
  • 洛谷P1525 [NOIP2010 提高组] 关押罪犯(种子并查集基础)
    题目链接:P1525[NOIP2010提高组]关押罪犯-洛谷|计算机科学教育新生态题目难度:普及+/提高题目描述:S城现有两座监狱,一共关押着 N 名罪犯,编号分别为 1∼N,有m对罪犯,每对之间有仇恨值,问如何分配罪犯使得现Z市长要看到其中最大的矛盾值最小。输入格式:每行中两个数之......