計算之道第一場A百度無人車詳解
阿新 • • 發佈:2018-11-11
官方給出的題目解析是二分搜尋 直接二分最後的最大值,然後檢車錢是否足夠即可
為什麼不能將l設定為最小值的原因:while迴圈的退出條件是r-l <= 0題目中有一句話就是任何時候每一輛車的重量必須大於等於1kg 按照你原來的設計思想,也就是將l設定為最小值那麼當s/p比較大的時候(大於所有車的重量和的時候),按照原來的思想 當代碼執行到最小值的時候就退出while迴圈,但是此時車的重量仍然是可以繼續減重的 例如測試資料 4 6 7 8 9 1 32 按照原來的思想輸出的結果應該是6 但是實際的輸出是1(任何時候,車的重量必須大於等於1)
#include <bits/stdc++.h> using namespace std; typedef long long lln; int a[20005]; int start, _end; lln n, p, s; lln cnt; bool cmp(int x, int y){ return x >= y; } bool Judge(int x){ if(x < 1){ return false; } lln sum = 0; for(int i = 0; i < n; i++){ if(a[i] <= x) break; if(a[i] > x){ sum += (a[i]-x); } } return sum <= cnt; } int main(){ scanf("%lld", &n); for(int i = 0; i < n; i++){ scanf("%d", &a[i]); } sort(a, a+n, cmp); scanf("%lld %lld", &p, &s); cnt = s/p; start = 0; _end = a[0]; int ans = _end; //最終 最重的車輛的重量 int middle; //中間值 while(_end - start > 0){ middle = (start + _end)/2; if(Judge(middle)){ _end = middle; ans = middle; }else{ start = middle+1; } } printf("%d\n", ans); return 0; }