记人生第四次参加CodeForces比赛

本文讲述了两道编程竞赛题目,涉及字符串操作和排列问题。第一题要求找到在特定条件下使结果字符串字典序最小的操作序列,第二题则需找出字典序最小的神秘排列。解决方法包括对原排列进行升序排序并根据条件调整,以及寻找满足条件的最小值。

Codeforces Round #798 (Div. 2) 

Saturday, June 11, 2022 at 00:35UTC+8

库兹涅科夫喜欢艺术、诗歌和音乐。以及由小写英文字母组成的字符串。 最近,Kuznecov 发现了两个长度分别为 n 和 m 的字符串 a 和 b。它们由小写英文字母组成,两个字符串中都不包含任何字符。 让另一个字符串 c 最初为空。 Kuznecov 可以执行以下两种类型的操作: 从字符串 a 中选择任意一个字符,将其从 a 中删除,并将其添加到 c 的末尾。 从字符串 b 中选择任意一个字符,将其从 b 中删除,并将其添加到 c 的末尾。 但是,他不能连续做超过 k 个相同类型的操作。他必须执行操作,直到 a 或 b 变为空。在他完成后,c 的字典最小可能值是多少? 当且仅当以下条件之一成立时,字符串 x 在字典上小于字符串 y: x 是 y 的前缀,但 x≠y; 在 x 和 y 不同的第一个位置,字符串 x 有一个字母在字母表中出现的时间比 y 中的相应字母更早。 输入 输入数据中有几个测试用例。第一行包含一个整数 t (1≤t≤100)——测试用例的数量。接下来是测试用例描述。 每个测试用例的第一行包含三个整数 n、m 和 k (1≤n,m,k≤100) — 来自语句的参数。 每个测试用例的第二行包含长度为 n 的字符串 a。 每个测试用例的第三行包含长度为 m 的字符串 b。 字符串仅包含小写英文字母。保证没有符号同时出现在 a 和 b 中。 输出 在每个测试用例中,输出一个字符串 c——问题的答案。

今天就弄这道题。

Monocarp 是一个住在 Byteland 的小男孩,他热爱编程。 最近,他发现了一个长度为 n 的排列。他必须想出一个神秘的排列。它必须是一个新的排列,以便在每个位置上都不同于旧的排列。 更正式地说,如果旧的排列是 p1,p2,...,pn 而新的排列是 q1,q2,...,qn 它必须持有 p1≠q1,p2≠q2,…,pn≠qn。 Monocarp 害怕字典上的大排列。你能帮他找到字典上最小的神秘排列吗? 输入 输入数据中有几个测试用例。第一行包含一个整数 t (1≤t≤200)——测试用例的数量。接下来是测试用例描述。 每个测试用例的第一行包含一个正整数 n (1≤n≤1000) — 排列的长度。 每个测试用例的第二行包含 n 个不同的正整数 p1,p2,…,pn (1≤pi≤n)。保证 p 是一个排列,即。 e.对于所有 i≠j,pi≠pj。 保证所有测试用例中 n 的总和不超过 1000。 输出 对于每个测试用例,输出 n 个正整数——字典序上最小的神秘排列。如果不存在这样的排列,则输出 -1。 在第一个测试用例中,可能的神秘排列是 [2,3,1] 和 [3,1,2]。两者中的较小的是[2,3,1]。 在第二个测试用例中,[1,2,3,4,5] 是字典上最小的排列,它也是神秘的。 在第三个测试用例中,可能的神秘排列是 [1,2,4,3], [1,4,2,3], [1,4,3,2], [3,1,4,2], [3 ,2,4,1]、[3,4,2,1]、[4,1,2,3]、[4,1,3,2] 和 [4,3,2,1]。最小的是 [1,2,4,3]。

算了还是弄这道题。

我母亲回来了,我有些难以思考这道题。但无论如何我既然来打了这场比赛,我就得把他好好打下去。哪怕我的大脑已经充满了抑郁的回忆,我不能接受自己把时间荒废过去。

我们来看这道题。我的思路是:先快排求出他的升序,

她说再给我十分钟。哪怕只有一分钟,我也不会荒废过去。

然后再考虑是否满足题目所说的条件。若不满足,则与他后面的那一项交换。但是不排除某些情况,比如2,3,3,就是-1。因此这样的方式未免过于暴力,非常行不通。

但是我没有时间了,暴力我也把他打了。

爆零了。

rating加了41。还好。

zex告诉我真正的思路是:对于每p[i],求出满足条件的最小q[i]。矛盾只可能再最后出现,这时便交换最后两个q。若n==1,无解。

Codeforces 比赛中提交题目后未获得分数可能有多种原因,以下是常见的几种情况及其解决方法: ### 1. 提交未通过测试用例 如果提交的代码未能通过所有测试用例,则不会获得任何分数。这种情况通常是因为代码逻辑存在错误,或者未能处理某些边界条件。 - **解决方法**: - 仔细阅读题目要求,确保理解所有输入输出条件。 - 在本地测试代码,使用各种测试用例(包括边界条件)验证逻辑是否正确。 - 检查是否有语法错误或运时错误(如数组越界、空指针访问等)。 ### 2. 提交时间过晚导致分数降为最低 根据比赛规则,每道题的分数会随着时间推移而减少。如果提交时间过晚,即使通过了所有测试用例,最终得分也可能仅达到该题的最低得分(即总分的30%)[^1]。 - **解决方法**: - 尽量在比赛早期解决题目,以获得更高的分数。 - 对于较难的问题,合理安排时间,避免因时间不足而错过高分机会。 ### 3. 多次失败提交导致扣分 每次失败的提交会扣除一定分数(通常为50分)。如果在通过题目之前有多次失败提交,最终得分会被显著降低。 - **解决方法**: - 在提交之前,确保代码经过充分测试,避免不必要的错误提交。 - 如果对代码不确定,可以先进本地调试或使用自定义测试用例验证。 ### 4. 代码运超时或内存超出限制 即使代码逻辑正确,但如果运时间超过题目设定的限制,或者使用内存超出允许范围,也会导致提交失败。 - **解决方法**: - 优化算法,减少时间复杂度和空间复杂度。 - 避免不必要的循环嵌套或重复计算。 - 使用更高效的数据结构(如使用 `StringBuilder` 而不是频繁拼接字符串)。 ### 5. 编译错误或格式错误 如果代码存在语法错误或未按照题目要求的输入输出格式编写,会导致编译失败或输出不正确。 - **解决方法**: - 确保代码语法正确,符合所选编程语言的标准。 - 严格按照题目描述的输入输出格式编写代码,避免多余的空格或换。 ### 6. 使用了不支持的语言或库 Codeforces 支持多种编程语言,但某些库或函数可能不被允许使用。 - **解决方法**: - 确保使用的语言和库是 Codeforces 支持的。 - 避免使用特定平台的函数或特性,保持代码的可移植性。 ### 示例代码:检查输入输出格式 ```python # 正确的输入输出格式示例 import sys def main(): n = int(sys.stdin.readline()) for _ in range(n): a, b = map(int, sys.stdin.readline().split()) print(a + b) if __name__ == "__main__": main() ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值