1. 程式人生 > >2018 計蒜之道 初賽第一場 A 百度無人車

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

題目概述

百度一共製造了 n 輛無人車,其中第i輛車的重量為 ai kg。

由於車輛過重會增大輪胎的磨損程度,現在要給這 n輛車減輕重量。每將一輛車減輕 1 kg 需要消耗 p萬百度幣,總預算為 s 萬百度幣。

現在希望你設計一種最優的減重方案,使得最重的車輛的重量是所有減重方案中最小的。任何時候,每輛車的重量必須大於等於1 kg。並且減重方案只能減輕整數kg。

輸入格式

第一行輸入一個整數 n,表示百度無人車的數量。

接下來一行輸入 n 個整數,其中第 i 個整數 ai , 表示第 i 輛車的重量。

接著一行輸入兩個整數 p, s,分別表示把一輛車減重 1 kg 需要花費 p 萬百度幣,總的預算是 s 萬百度幣。

保證1 ≤ n ≤ 200001 ≤ a ≤ 200001 ≤ p ≤ 200001 ≤ s ≤ 1018

輸出格式
輸出一個整數,表示經過你設計的最優減重方案後,最重的車輛的重量是多少 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; }