FishingMaster(HDU-6709)【贪心】

题目链接:https://vjudge.net/problem/HDU-6709

题意:一个人要抓n条鱼,每抓一条鱼用时K,每烹饪一条鱼用时a[i],抓鱼的过程不能被打断,烹饪鱼的时候可以抓鱼,也可以多烹饪一会儿,求烹饪完n条鱼所需最短时间。

思路:(学习了这位大佬的思路)https://blog.csdn.net/qq_40655981/article/details/100104985

  设num=∑(a[i]/k),

  该问题可以分两种情况讨论:

    1.num>=(n-1),此时每烹饪一条i鱼,同时抓(a[i]/k)条鱼即可保证除去K外的每一份时间都在烹饪鱼。

    2.num<(n-1),此时,需要使浪费的时间最少,则需以(k-a[i]%k)从小到大的顺序抓捕和烹饪鱼。

代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;
int t,n,k;
int a[100010];

bool cmp(int x1,int x2){
    return (k-x1%k)<(k-x2%k);
}
int main(){
    int num;
    long long ans;
    scanf("%d",&t);
    while(t--){
        num=0;
        scanf("%d%d",&n,&k);
        ans=k;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            num+=a[i]/k;
            ans+=a[i];
        }
        if(num<n-1){
            sort(a+1,a+1+n,cmp);
            num=n-num-1;
            for(int i=1;i<=num;i++){
                ans+=(k-a[i]%k);
            }
        }
        printf("%lld\n",ans);
    }
}

 

posted @ 2019-11-02 22:31  xxmlala  阅读(61)  评论(0编辑  收藏