对拍过程及中途数据可见附件区。

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 条评论

目前还没有评论...