2018 計蒜之道 初賽第一場 A 百度無人車
阿新 • • 發佈:2019-02-11
題目概述
百度一共製造了 n 輛無人車,其中第i輛車的重量為 a kg。
由於車輛過重會增大輪胎的磨損程度,現在要給這 n輛車減輕重量。每將一輛車減輕 1 kg 需要消耗 p萬百度幣,總預算為 s 萬百度幣。
現在希望你設計一種最優的減重方案,使得最重的車輛的重量是所有減重方案中最小的。任何時候,每輛車的重量必須大於等於1 kg。並且減重方案只能減輕整數kg。
輸入格式
第一行輸入一個整數 n,表示百度無人車的數量。
接下來一行輸入 n 個整數,其中第 i 個整數 a , 表示第 i 輛車的重量。
接著一行輸入兩個整數 p, s,分別表示把一輛車減重 1 kg 需要花費 p 萬百度幣,總的預算是 s 萬百度幣。
保證1 ≤ n ≤ 20000,1 ≤ a ≤ 20000, 1 ≤ p ≤ 20000, ≤ s ≤ 。
輸出格式
輸出一個整數,表示經過你設計的最優減重方案後,最重的車輛的重量是多少 kg。
解題方法
二分列舉答案(減重後最輕的車的重量).
然後比較當前所有車的差距,輕的不管它,重的花費P*(差距)百度幣減到答案那麼重.
合理則繼續減小答案,不合理就放大.
是一道比較裸的二分題目.
複雜度O(nlog(n))
程式碼
#include<iostream>
#include<cstring>
using namespace std ;
typedef long long LL;
const int maxn = 1e5 + 7;
int a[maxn], n;
LL p ,s;
bool fun(int x) {
LL sum = 0;
for(int i=0;i<n;++i) {
if(a[i] > x) sum += p*(a[i] - x);
}
if(sum <= s) return(true); else
return(false);
}
int b_search(int l, int r) {
int mid;
while(l < r) {
mid = (l + r) >> 1 ;
if(fun(mid)) r = mid; else
l = mid + 1;
}
return(r);
}
int main() {
std::ios::sync_with_stdio(false);
cin >> n;
for(int i=0;i<n;++i) cin >> a[i];
cin >> p >> s;
cout << b_search(1, 20000) << endl;
return 0;
}