P7713 EZEC 10 打分 題解

2022-09-19 17:36:14 字數 987 閱讀 5995

題目傳送門

可能更好的閱讀體驗

很簡單的貪心,我們可以把打分的情況分為三種討論。

顯然,如果要使得答案盡量大,就盡量把除最小得分以外的分數都加成最大的分數。我們可以假設要把除最小值、最大值以外的分數都變成最大分需要加 \(sum\) 分,這樣就可以舉出三種情況:

1.\(sum=m\),剛好可以把除了最大值與最小值以外的分數都變成最大的分數,此時若最大分數為 \(maxn\),答案則是 \(maxn(n-2)\)。

2.\(sum>m\),可以保證有至少一種加分辦法不改變最大值與最小值。若除最大值最小值以外分數的和為 \(cnt\),答案則是 \(cnt+m\)。

3.\(sum,可以先把除了最小值最大值以外的分數都先變成最大值,此時 \(m\) 還剩下 \(m-sum\) 分可以加。可以把除最小值以外的分數再加上 \(\frac\) 分,如果還有餘數 \(t\),就先把新的序列排序,然後把區間 \([2,1+t]\) (也可以寫作 \([2,2+t)\))中的每個 \(a_i\) 都增加 \(1\)。

cin>>n>>m;

for(int i=1;i<=n;i++)

sort(a+1,a+n+1);//排序後,a[1]是最小分數,a[n]是最大分數

for(int i=2;i<=n-1;i++)

我使用了較慢的排序函式來排除最小分數和最大分數,當然可以使用更快的 \(o(n)\) 的迴圈找最大和最小分數。

if(sum==m)

m-=sum;//算出m還剩下多少可以用

for(int i=2;i<=n;i++)

for(int i=2;i<=1+m%(n-1);i++)

sort(a+1,a+n+1);//再次排序

for(int i=2;i<=n-1;i++)

cout《當 \(sum時,先把除了最小最大分數以外的分數都變成最大分數,然後把剩餘的 \(m\) 先平攤,如果還有剩的,就依次加一,直到最後剩餘的這部分也用完。

ac記錄

題解 P6435 EZEC 1 數列

傳送門 久違地來一波題解,來乙個數學角度推式子的方法 記第 k 次合併後的第 i 個數為 f 根據題意,所求即為 ans f 且有 f af bf c,f i 形式上,我們設 exists d wedge f d a f d b f d 則不難換算出 a b 1 d c 注意,只是形式上這樣設,d ...

P6788 EZEC 3 四月櫻花

p6788 ezec 3 四月櫻花 難點只有乙個 y prod y prod t cdot frac prod t 然而這點我整場月賽都沒想出來,技不如人甘拜下風。有了這個式子之後式子就隨便推了。出題人似乎稍微卡了一下 o n 的整除分塊。我卡了下常就過了。include define ll lon...

P7287 EZEC 5 魔法 貪心 二分

一開想列舉答案區間 l,r l,r l,r 發現這樣列舉會炸。正解是列舉操作次數,而且注意到最優的操作肯定是先 再乘的。所以我們可以列舉乘的次數,然後二分加的次數,至於找最大區間就可以貪心,o n o n o n 求出最大欄位和即可。注意二分的下界是0,上界不要太大,不然會爆lon glon glo...