description
pc被惡龍擄走了,作為一名王子,你並打不過惡龍,所以你需要武裝你的士兵一起去戰勝惡龍。
但是惡龍太強了,以至於每個士兵都得有m種不同的裝備才能與擄走pc的惡龍去戰鬥。
現在你有n種裝備,每種裝備有ai件,你想知道你最多能武裝多少名士兵(不要求每個士兵裝備相同,只用湊出m種不同的裝備,就可以獲得pc的祝福)?
input
先輸入乙個值n,再輸入乙個值m,接下來一行n個數,第i個數ai代表第i個裝備的數量。
output
乙個整數,你能夠武裝的最多士兵數。
sample input 1
5 33 1 2 3 3
sample output 1
4
hint
資料範圍:1 <= m , n <= 1e5, 1 <= a[i] <= 1e9
這個題可能就不是那麼好想到了,需要轉乙個彎。
我們先對裝備的數量排個序,記錄一下排序後的字首和,二分答案記為x,檢查答案x的時候從後往前遍歷,比x大的數是一定滿足分配的, 當比x小的時候,我們用此時的字首和除一下x,其值記為s,如果s與之前比x大的種類數量的和大於等於m,則該答案為可行答案,繼續二分。
以下是ac**:
#include usingnamespace
std;
#define ll long long
const
int mac=1e5+10
;const
int inf=1e9;
inta[mac],n,m;
ll sum[mac];
bool check(int
x) }
return
false;}
intmain()
else r=mid-1
; }
printf (
"%d\n
",ans);
return0;
}
字首和 二分
powered by ab in 局外人 拿洛谷的乙個例子記一下字首和。資料超過了1e5,故o n 2 的演算法又行不通,所以換二分 include typedef long long ll using namespace std ll n,m,l,r ll a 1000001 sum 100000...
二分與字首和
時間複雜度o log n 資料區間 l mid r 實現 while l給定乙個按照公升序排列的長度為 n 的整數陣列,以及 q 個查詢。對於每個查詢,返回乙個元素 k 的起始位置和終止位置 位置從 0 開始計數 如果陣列中不存在該元素,則返回 1 1。輸入格式 第一行包含整數 n 和 q,表示陣列...
二分和字首和(藍橋)
二分 1.數的範圍 題意 給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。1 n 100010,q 10000.對於每個查詢,返回乙個元素k的起始位置和終止位置 位置從0開始計數 如果陣列中不存在該元素,則返回 1 1 思路 對於已經排好序的,且要求查詢陣列中某乙個數的位置,屬於搜尋類...