- 月赛
Panda粮商鬼才正式HACK
- @ 2026-7-4 9:23:11
对拍过程及中途数据可见附件区。
Panda为[SANHAIOJ大月赛]Round 1 Div.3投的题目C 粮商鬼才解法被正式Hack。
Panda代码以下简称std.cpp,暴力代码以下简称brute.cpp,在附件里相同。
附件里的各个data文件夹里的data.in为输入数据,brute.out为暴力代码的输出,std.out为Panda代码的输出。
std.cpp部分错误:
I.在必亏状态下的错误
以下数据可见附件区data1文件夹。
对于以下数据:
5 17
4 4 4 4 4
5 5 4 5 2
2
3 4 3
1 5 3
当在题目要求的必须行动时,该情况一定必亏。
brute.cpp的输出为13, std.cpp的输出为17。
注意到std.cpp的输出为17,而brute.cpp的输出为13,说明std.cpp在必亏状态下下的输出是错误的,std.cpp没有执行任何操作,显然不合法。
II. std.cpp的贪心思路的错误
以下数据可见附件区data2文件夹。
对于题目赛时数据1-3,测试点编号3
4 242
28 19 68 94
29 95 51 75
5
1 2 94
3 4 25
2 4 98
2 3 78
1 4 31
最优路径为:
国家1买粮:购买7箱
花费:28 * 7 = 196
剩余资金:242 - 196 = 46
携带粮食:7箱
走道路:1 -> 4
路费:31
剩余资金:46 - 31 = 15
携带粮食:7箱
国家4卖粮:卖出7箱
收入:7 * 75 = 525
最终资金:15 + 525 = 540
最终答案:540
而std.cpp的输出为242,显然错误。
我们注意到std.cpp的100-111行:
// 在 v 必须行动:二选一
// 选择买(花光钱买尽可能多的粮)
if (W1[v] > 0) {
ll buy = am / W1[v];
cand[v].push_back({ag + buy, am % W1[v]});
} else {
cand[v].push_back({ag, am}); // W1[v]=0 时避免除零,视为买 0 箱
}
// 选择卖(卖光所有粮)
cand[v].push_back({0, am + ag * W2[v]});
当尽所有金钱卖光所有粮后,可能不够付路费,导致错误的输出。
故std.cpp的贪心思路的错误。
后记
这一次比赛问题较大,审题不严,出现了没有说最大数据范围的情况。
希望今后加强审题,避免出现类似情况。
期待该题有新的解法。
0 条评论
目前还没有评论...