[CP] 记一次对拍的经历 / 究竟谁才是小丑?

image

最近切构造题碰上一块硬骨头。算法本身很简单,贪心即可。我甚至还在纸上做了贪心算法的最优性证明。

然后连续 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]; });

我输了。

posted @   ZXPrism  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示