2354 分班級 二分

2021-08-07 17:52:57 字數 1446 閱讀 9093

題目描述

zoro是乙個有強迫症的人,他喜歡均衡。

17級的新生要開學了,起初所有班級是按照學生的**地分的,各班人數非常不合理。於是老師要求zoro來讓各班人數均衡一下。

由於學校系統陳舊,每次調換只能是zoro自己手動的把乙個學生從乙個班級拉到另外乙個班級,由於zoro有強迫症,他每次會找出班級人數最多的那個拉出乙個人轉到乙個人數最少的班級,而且每次操作,耗費一次許可權,而他的賬號只有k次許可權。老師最後會看所有班級人數差的最大值。

由於班級實在太多,zoro要做完需要很長時間,你能不能幫助zoro先計算出他工作完成後所有班級人數差的最大值報告給老師。

輸入 第一行輸入兩個整數n和k,分別代表班級數量和zoro賬號的操作許可權次數。

接下來一行n個整數 第i個數字代表第i個班級有ci個人。

(1<=n<=500000,0<=k<=1e9,0<= ci <=1e9)

輸出 輸出乙個整數表示最後所有班級人數差的最大值。

樣例輸入

5 1

1 2 3 4 5

樣例輸出

2 題目鏈結

思路:

找出變化後最大值和最小值的分界點,其實就是平均值,根據這個兩次二分:

第一次二分人數少的班級區間,找出滿足使人數少的班級增加k個後的最小值;

第二次二分人數多的班級區間,找出滿足使人數多的班級減少k個後的最大值;

需要注意的是平均值可能不是整數,那麼無論k為何值最後結果都不可能是0,注意第二次二分的左端點;

#include 

#include

#include

#include

typedef

long

long ll;

using

namespace

std;

ll n, k, sum = 0;

ll a[500010];

bool judge1(ll x)

return ans <= k;

}bool judge2(ll x)

return ans <= k;

}int main()

ll len = sum / n;

ll res1, res2;

ll l = 1, r = len, mid;

while(r - l >= 0)

else r = mid - 1;

}l = len + ((sum % n) ? 1 : 0), r = sum, mid; //注意左端點

while(r - l >= 0)

else l = mid + 1;

}// printf("%lld %lld\n", res1, res2);

printf("%lld\n", res2 - res1);

return

0;}

nyoj2354 分班級(經典二分)

zoro是乙個有強迫症的人,他喜歡均衡。17級的新生要開學了,起初所有班級是按照學生的 地分的,各班人數非常不合理。於是老師要求zoro來讓各班人數均衡一下。由於學校系統陳舊,每次調換只能是zoro自己手動的把乙個學生從乙個班級拉到另外乙個班級,由於zoro有強迫症,他每次會找出班級人數最多的那個拉...

1128 二分 二分查詢

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...

分巧克力 (二分)

問題描述 兒童節那天有k位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。小明一共有n塊巧克力,其中第i塊是hi x wi的方格組成的長方形。為了公平起見,小明需要從這 n 塊巧克力中切出k塊巧克力分給小朋友們。切出的巧克力需要滿足 1.形狀是正方形,邊長是整數 2.大小相同 例如一塊6x5...