百度一共製造了 nn 輛無人車,其中第 ii 輛車的重量爲 a_i\ \mathrm{kg}ai kg。
由於車輛過重會增大輪胎的磨損程度,現在要給這 nn 輛車減輕重量。每將一輛車減輕 1\ \mathrm{kg}1 kg 需要消耗 pp 萬百度幣,總預算爲 ss 萬百度幣。
現在希望你設計一種最優的減重方案,使得最重的車輛的重量是所有減重方案中最小的。任何時候,每輛車的重量必須大於等於 1\ \mathrm{kg}1 kg。並且減重方案只能減輕整數 \mathrm{kg}kg。
輸入格式
第一行輸入一個整數 nn,表示百度無人車的數量。
接下來一行輸入 nn 個整數,其中第 ii 個整數 a_iai表示第 ii 輛車的重量。
接着一行輸入兩個整數 p, sp,s,分別表示把一輛車減重 1\ \mathrm{kg}1 kg 需要花費 pp 萬百度幣,總的預算是 ss萬百度幣。
保證 1 \le n \le 200001≤n≤20000,1 \le a_i \le 200001≤ai≤20000,1 \le p \le 200001≤p≤20000,1 \le s \le 10^{18}1≤s≤1018。
輸出格式
輸出一個整數,表示經過你設計的最優減重方案後,最重的車輛的重量是多少 \mathrm{kg}kg。
樣例輸入1複製
4
6 7 8 9
1 3
樣例輸出1複製
7
樣例輸入2複製
5
11 14 6 13 11
4 68
樣例輸出2複製
8
桶排或二分
#include<bits/stdc++.h>
using namespace std;
const int maxn=20000+100;
typedef long long ll;
ll n;
ll a[maxn];
ll p,s;
int main()
{
scanf("%lld",&n);
ll x;
ll j;
for(j=0;j<n;j++){
scanf("%lld",&x);
a[x]++;
}
cin>>p>>s;
ll t=s/p;
ll i;
for(i=20000;i>1;i--){
if(t==0)break;
if(a[i]>t)break;
a[i-1]+=a[i];
t-=a[i];
}
cout<<i<<endl;
return 0;
}