Codeforces #710D

Codeforces #710D

起因

好久没玩CF已经废了,于是,来做做div3,发现真的已经废了.

经过

做题->想不出来->看题解->感觉题解不对(时间复杂度太大了吧!)->再看评论->有一个更简单的方法->按照别人说的提交->Accepted->重新看题解->懂了->思考评论方法的合理性

结果

  • 题解方法的合理性 数据是 2 e 5 2e5 2e5的,所以用priority_queue的话,时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn),所以没问题,可以通过,每一次消掉最大的两个,(应该)是可以收敛的.

  • 评论中方法的合理性

    (1) 如果最大的比剩余其它的加起来还要大,那么结果就是两者之差;
    (2) 如果最大的正好是剩余的之和,那么结果为零;
    (3) 如果最大的不如其它的大,那么结果是0或1,这要考虑最后总数的奇偶性.

    其实我也想到过这种可能性(xp),但是没敢写,没法证明正确性呀!
    那么我现在来证明以下了(归纳法):
    假设现在已经满足条件,最大的不如其它的大,那么至少有三种数,用 c 1 , c 2 , c 3 , c r c_1,c_2,c_3,c_r c1,c2,c3,cr,分别表示最大的,第二大的,第三大的,和剩余之和,且 c 1 , c 2 , c 3 c_1,c_2,c_3 c1,c2,c3不为0,令 c 1 − = 1 , c 2 − = 1 c_1-=1,c_2-=1 c1=1,c2=1,此时,若 c 1 c_1 c1仍然最大,则重新赋值,进行该过程,若 c 1 < c 3 c_1<c_3 c1<c3,则若 c 1 c_1 c1不为 0 0 0,有此时 c 1 + c 2 + c r = 2 × ( c 3 − 1 ) + c r > = c 3 c_1+c_2+c_r=2\times(c_3-1)+c_r>=c_3 c1+c2+cr=2×(c31)+cr>=c3结果为0或保持状态,若 c 1 = c 2 = 0 c_1=c_2=0 c1=c2=0,则 c 3 = 1 c_3=1 c3=1 c r = 0 c_r=0 cr=0,显然此时结果为 1 1 1.

写的挺乱,也不知道为什么,我还这么悠闲的在这里写博客xp,自己的承压能力真是越来越强了.

Guess you like

Origin blog.csdn.net/agctXY/article/details/117391163