2018 計蒜之道 初賽 第一場 - 百度無人車

百度一共製造了 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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章