洛谷 P3615 如厕计划

news/2025/1/9 19:54:37/文章来源:https://www.cnblogs.com/maburb/p/18662813

题意: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";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/866708.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025多校冲刺省选模拟赛3

过于困难,直接放弃2025多校冲刺省选模拟赛3\(T1\) A. 等差 \(100pts/100pts\)考虑哈希,每 \(k\) 个作为一组与上一组统一计算。取 \(Base>\) 值域时用高精度来存储并判断的正确性显然。观察到可行的最小的 \(k\) 单调不降,不妨直接枚举答案。暴力实现时间复杂度为 \(O(n…

还不会 Cert Manager 自动签发证书?一文掌握

相信很多小伙伴对于 Cert Manager 不陌生,Cert Manager 是 Kubernetes 上的证书管理工具,基于 ACME 协议与 Lets Encrypt 签发免费证书并为证书自动续期,实现永久免费使用证书。 本文将介绍如何使用 Cert Manager 实现自动签发证书并与 Rainbond 结合使用。 Cert Manager 概…

JAVA-Day 09:While循环语句

While循环 while循环格式 初始化语句; while(条件判断语句){ 循环体语句; 条件控制语句; } 初始化语句只执行一次 判断语句为True,循环继续 判断语句为False,循环结束 例: 世界最高山峰珠穆朗玛峰的高度为8844.43米=8844430毫米,假如有 一张足够大的纸,它的厚度为0.1毫米。…

rust学习十六.2、并发-利用消息传递进行线程间通讯

通过信道是rust的解决线程之间通信的2个工具之一,另外1个是是共享内存状态。 rust推出这个,明显地是因为受到go之类的影响。 在书籍中,作者提到go编程文档中的内容: 不要通过共享内存来通讯;而是通过通讯来共享内存(Do not communicate by sharing memory; instead, share…

2025,谁会成为 AI Agent 的新入口?|播客《编码人声》

「编码人声」是由「RTE开发者社区」策划的一档播客节目,关注行业发展变革、开发者职涯发展、技术突破以及创业创新,由开发者来分享开发者眼中的工作与生活。2024 年末,一群来自 Android、Chrome OS、Oculus 等操作系统的开发元老联合创业,推出 AI Agent 操作系统 /dev/agen…

【Windows内核】Ntdll解除挂钩学习

简介 我们之前都是直接通过使用直接系统调用的方式来绕过用户态钩子,通过在项目文件中创建并调用系统调用来实现此目标。还有另外一种方法也可以绕过用户态的钩子,那么这种方法是将已经加载到进程中的钩子DLL替换为一个未经修改且未被钩主的版本来达到相同的目标。 将勾住的D…

21. 主窗口控件

一、主窗口控件之前,我们使用可视控件创建具体的实例时都选择了一个父窗体,将控件放到这个窗体上,即使在创建实例时没有选择父窗体,也可以用控件的 setParent() 方法将控件放到父窗体上。如果一个控件没有放到任何窗体上,则这个控件可以单独成为窗口,并且可以作为父窗口来…

智慧帮手:一站式搭建帮助中心,优化客户服务体验

在数字化时代,客户服务已成为企业赢得市场、留住客户的关键。一个高效、便捷的帮助中心,不仅能够快速响应客户需求,还能提升客户满意度和忠诚度。然而,如何搭建一个既满足客户需求又符合企业特色的帮助中心,成为众多企业面临的挑战。本文将探讨如何借助一站式解决方案,如…

解锁餐饮新篇:精准搭建内部知识库,赋能高效运营

在当今竞争激烈的餐饮行业中,提升运营效率和服务质量已成为企业脱颖而出的关键。随着餐饮业务的不断扩展,内部信息管理和知识传承成为了一大挑战。如何构建一个高效、精准的内部知识库,成为解锁餐饮新篇章的重要一环。本文将探讨如何借助智能化工具,如HelpLook,实现这一目…

【YashanDB知识库】进行load data的时候报找不到动态库liblz4.so

本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7863047.html?templateId=1718516 现象 23.2版本的依赖项准备里指明,要依赖动态库:liblz4.so,liblz4.so.1,liblz4.so.1.9.3 在执行load data的时候报找不到动态库liblz4.so 操作系统在/lib64/目…

JAVA-Day 08:For循环语句

For循环 For循环格式 for循环语句格式 for(初始化语句;条件判断语句;条件控制语句){ 循环语句体; } 执行流程: 1、执行初始化语句 2、执行条件判断语句,看其结果是True还是False,如果是True,执行循语句体,如果是False,循环结束 3、执行条件控制语句 4、回到2继续执行条件判…

记录---JS 的蝴蝶效应 —— 事件流

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣前言 在 JavaScript 的世界里,事件流就像一只永不停歇的蝴蝶,每一个动作、每一个点击、每一个滚动,都会触发一连串的蝴蝶效应。作为一名开发者,掌握事件流的艺术,不仅能让你的网页更加生动、更加交互,也能让用户体验…