1. 程式人生 > >計算之道第一場A百度無人車詳解

計算之道第一場A百度無人車詳解

官方給出的題目解析是二分搜尋 直接二分最後的最大值,然後檢車錢是否足夠即可

 

為什麼不能將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;
}