百度无人车

百度无人车

来源:
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;
}

猜你喜欢

转载自blog.csdn.net/wingrez/article/details/80463619