百度无人车
来源:
2018 计蒜之道 初赛 第一场
标签:参考资料:
相似题目:
题目
百度一共制造了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<=20000,1<=ai<=20000,1<=p<=20000,1<=s<=10E18。
输出
输出一个整数,表示经过你设计的最优减重方案后,最重的车辆的重量是多少kg。
输入样例1
4
6 7 8 9
1 3
输出样例1
7
输入样例2
5
11 14 6 13 11
4 68
输出样例2
8
解题思路
参考代码
#include<stdio.h>
#include<algorithm>
#define MAXN 20000+5
using namespace std;
int num[MAXN];
int main(){
int n;
long long p, s;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
sort(num,num+n);
scanf("%lld%lld",&p,&s);
long long m=s/p;
int beg, mid, end;
beg=1;
end=num[n-1];
int ans=num[n-1];
while(beg<end){
mid=(beg+end)/2;
int flag=1;
int res=0;
for(int i=0;i<n;i++){
if(num[i]>mid){
res+=num[i]-mid;
if(res>m){
flag=0;
break;
}
}
}
if(flag){
end=mid;
ans=mid;
}else{
beg=mid+1;
}
}
printf("%d",ans);
return 0;
}