官方给出的题目解析是二分搜索 直接二分最后的最大值,然后检车钱是否足够即可
为什么不能将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;
}