nyoj2354 分班級(經典二分)

2021-08-07 19:45:38 字數 1390 閱讀 7100

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與sum的比較(sum見ok函式)來判斷繼續二分左區間還是右區間。需要注意的是二分l,r的選擇和等號的新增位置。

舉個栗子:k=3,二分min時,排序後的人數陣列 【3 3 4 4 5 5 ...】,sum陣列【0 0 2 2 6 6...】,k卡在第二個4和第乙個5之間,實際上min=4,4和5分別是r和l,所以等號應加在l=mid+1語句上,return r;

二分max時,k=3,人數陣列【...6 6 7 7 8 8】,sum陣列【...6 6 2 2 0 0】,max實際是7,等號加在r=mid-1上,return l。

二分詳解部落格:

min就是算出sum = k所在的數為key,求出最後乙個與key相等的元素。等號寫在l = mid + 1, 答案是r

max就是算出sum = k所在的數為key,求出第乙個與key相等的元素。等號寫在r = mid - 1, 答案是l

#include #include #include #include #include using namespace std;

typedef long long ll;

const int n=500005;

ll a[n],n;

ll ok1(ll mid)

return sum;

}ll ok2(ll mid)

return sum;

}int main()

ll min1=r;

l=a[1],r=a[n];

//二分max

while(l<=r)

ll max1=l;

printf("%lld\n",max1-min1);

}return 0;

}

zzuli OJ 2354 小愛的愛情難題

情況說明 18級新生周賽 2 題目描述 古希臘哲學大師蘇格拉底的三個 曾求教老師,怎樣才能找到理想的伴侶。蘇格拉底沒有正面回答,卻讓他們走田埂,只許前進,且只給乙個機會,要求是選摘乙個最好最大的穗。第乙個 沒走幾步,就看見乙個又大又漂亮的穗,高興地摘下來了。但他繼續前進時,發現前面有許多比他的那個大...

2354 分班級 二分

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

mysql的預準備語句 23 5 4 預準備語句

23.5.4 預準備語句 使用預準備語句可提高重複使用語句的效能,在php中,使用prepare 方法來進行預準備語句查詢,使用execute 方法來執行預準備語句。php有兩種預準備語句 一種是繫結結果,另一種是繫結引數。1 繫結結果 所謂繫結結果就是把php指令碼中的自定義變數繫結到結果集中的相...