CF1920 Codeforces Round 919 (Div. 2)

LZH_03發表於2024-03-21

B. Summation Game

給你 \(n\) 個數(均大於0),Alice先執行一次刪除不超過 \(k\) 個數,Bob再執行一次把最多 \(x\) 個數變成相反數.

問最後陣列的最大和是多少?

這題本來是想先讓Alice刪除 \(k\) 個數,但顯然不太容易得到最優解,因為還有可能撤回Alice的刪除操作,再加上Bob的操作.

那如果先讓Bob操作 \(x\) 個數,再看這 \(x\) 個數中最大的是不是大於剩下的最大的數的二倍,是否可行?

比如Bob操作的最大的數a,剩下的最大的數是b,那麼如果Alice把a刪掉,得到的新的陣列的和應該是原陣列的和 \(s+a-2b\),那隻需要看a和2b的大小關係就可以了.
然而這隻對應一個數的情況,如果是多個數,就不奏效了.
如下:

8 5 3
2 3 3 3 5 5 9 9

正解應該刪除兩個9,然後Bob操作 3 5 5
按我們的演算法,Bob先操作5 9 9,然後我們進行判斷Alice是否要刪除9,Alice不會進行刪除操作,因為9<2*5

然而考慮每次操作兩個數: (3+5)*2 < (9+9) ,因此得到錯誤答案.

所以其實際需要滿足的大小關係是 \(\sum a \geq 2 * \sum b\) ,而不是僅考慮單個的數

Solution

正解 列舉Alice刪除前i個數後,Bob刪除前x個數

    for(int tk=0;tk<=k;tk++){
        ans = max(ans,sum[n - tk] - 2*(sum[n-tk] - sum[max(0ll,n-tk-x)]));
    }

相關文章