当我写这道题的笔记时,我发现我之前证明的时候推式子少了一个取等,AC 的代码也没有处理这个取等的特殊情况,然后就成功 Hack 了我 AC 的代码并顺带 Hack 了题解区的部分题解。
Hack 数据
input:
1
3 3 10
10 10 10
possible answer:
3 10
2 10
1 10
one of the wrong outputs:
3 10
3 0 2 10
2 0 1 10
被 Hack 的题解
被 Hack 的题解 1(注意被 Hack 的原因不是因为 Ta 的随机化)
被 Hack 的题解 2
被 Hack 的题解 3(这篇题解是题解区的最后一篇,Ta 的原博客文章好像无权查看)
被Hack的原因
默认集合内原材料按质量从小到大排序 {d1,d2,⋯,dn}。
当 m≥n 时,一次操作选 dn 单独凑一道菜,把剩余的质量放回集合。一次操作后 m→m−1。重复操作直至 m=n−1。
但是上面的方法需要保证 dn>k。
反证法:若 dn≤k,则 d1+⋯+dn≤nk,当且仅当 d1=⋯=dn=k 等号成立。故除了 d1=⋯=dn=k 的特殊情况,其他情况与 d1+⋯+dn=mk≥nk 矛盾。
所以当 d1=⋯=dn=k 时,上面的方法如果不特判会使得把质量 0 放回集合,或者 m→m−1,n→n−1,永远无法满足 m=n−1。