L 這是最難的題(二分 字首和)

2022-05-22 19:09:09 字數 1032 閱讀 2505

description

pc被惡龍擄走了,作為一名王子,你並打不過惡龍,所以你需要武裝你的士兵一起去戰勝惡龍。

但是惡龍太強了,以至於每個士兵都得有m種不同的裝備才能與擄走pc的惡龍去戰鬥。

現在你有n種裝備,每種裝備有ai​件,你想知道你最多能武裝多少名士兵(不要求每個士兵裝備相同,只用湊出m種不同的裝備,就可以獲得pc的祝福)?

input

先輸入乙個值n,再輸入乙個值m,接下來一行n個數,第i個數ai​代表第i個裝備的數量。

output

乙個整數,你能夠武裝的最多士兵數。

sample input 1 

5 3

3 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 using

namespace

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 思路 對於已經排好序的,且要求查詢陣列中某乙個數的位置,屬於搜尋類...