计算之道第一场A百度无人车详解

官方给出的题目解析是二分搜索 直接二分最后的最大值,然后检车钱是否足够即可

 

为什么不能将l设置为最小值的原因:while循环的退出条件是r-l <= 0题目中有一句话就是任何时候每一辆车的重量必须大于等于1kg 按照你原来的设计思想,也就是将l设置为最小值那么当s/p比较大的时候(大于所有车的重量和的时候),按照原来的思想 当代码执行到最小值的时候就退出while循环,但是此时车的重量仍然是可以继续减重的 例如测试数据 4 6 7 8 9 1 32 按照原来的思想输出的结果应该是6 但是实际的输出是1(任何时候,车的重量必须大于等于1)
 

#include 
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;
} 

 

你可能感兴趣的:(计算之道第一场A百度无人车详解)