[CP] 记一次对拍的经历 / 究竟谁才是小丑?
最近切构造题碰上一块硬骨头。算法本身很简单,贪心即可。我甚至还在纸上做了贪心算法的最优性证明。
然后连续 6 次 WA on test 2,前两次是因为代码存在实现上的 bug,后四次则是为了 “套” 出导致错误的 test case。
可惜没套出来,只知道那个 test case 的输入有 75 个元素。
我坚信自己的算法是对的,因此我与 problem setter 之间必有一人是小丑。
发起挑战!
挑战者:我 - 无名小卒
被挑战者:Mike Mirzayanov - Codeforces 创始人
会赢的。
使用对拍进行检验:
import random import os testcaseNum = 100 result = str(testcaseNum) + "\n" for i in range(testcaseNum): n = random.randint(1, 5) result += str(3 * n) + "\n" for j in range(3 * n): result += str(random.randint(0, 100)) + " \n"[j == 3 * n - 1] file = open("test.txt", "w") file.write(result) file.close() os.system("mine.exe < test.txt > out1.txt") os.system("std.exe < test.txt > out2.txt") mine = open("out1.txt") std = open("out2.txt") mineStr = mine.readlines() stdStr = std.readlines() mine.close() std.close() for i in range(testcaseNum): if mineStr[i] != stdStr[i]: print( "wrong answer {}th numbers differ - expected: '{}', found: '{}'".format( i + 1, stdStr[i][:-1], mineStr[i][:-1] ) )
很快找到了一个有问题的 test case:
1 12 51 29 15 21 57 10 59 56 89 93 86 54
我的程序输出 1
,官解为 4
,在纸上按照我的算法进行手动求解,答案也为 4
。
经过检查发现自己的代码中,有一处涉及索引数组排序的地方输出了错误的结果:
std::vector<int> idx = {0, 1, 2}; std::sort(idx.begin(), idx.end(), [&](int lhs, int rhs) { return c[idx[lhs]] < c[idx[rhs]]; });
可是同样的写法我之前用过许多次,都没有出现任何问题……
然后突然发现应该写成:
std::vector<int> idx = {0, 1, 2}; std::sort(idx.begin(), idx.end(), [&](int lhs, int rhs) { return c[lhs] < c[rhs]; });
我输了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理