HDU 6709 Fishing Master (贪心)

题意:

有n条鱼,每条鱼要煮相应的时间才能吃,捕一条鱼的时间是相同的,在捕鱼的时间内不能做其他事,可以捕多条鱼,求把所有的鱼都煮熟需要多少时间。

分析:

抓第一条鱼的耗时是无法避免的,抓鱼应该从烹饪时间最长的开始抓起,这样才可以用烹饪时间去抓更多的鱼,而剩下的不够抓一条鱼的烹饪时间应该存下来,后面在抓鱼的时候从这些时间中选出最大的x,抓鱼的时间会和烹饪的时间重合最多,这样可以使时间(k-x)最小。

参考博客:https://blog.csdn.net/qq_41505957/article/details/100043677

这题没想出来,一直在考虑剩下的那一小段该怎么办到底是要等还是先抓让锅等,然而上面这种思路就很巧妙剩下的一段考虑对后面的影响,不用考虑对当前的。中间要开longlong,

#include

#define mm(a,b) memset(a,b,sizeof(a))
#define ACCELERATE (ios::sync_with_stdio(false),cin.tie(0))
#define pii pair
#define pid pair
#define pil pair
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define PI acos(-1.0)
#define E exp(1.0)
//#define io
using namespace std;

const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;

const int maxn=1e5+10;

ll a[maxn];

int main(){
    #ifdef io
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif

    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        ll k;
        scanf("%d%lld",&n,&k);
        rep(i,1,n) scanf("%lld",&a[i]);
        sort(a+1,a+1+n,greater{});
        ll cnt=0;
        ll ans=k+a[1];
        cnt+=a[1]/k;
        priority_queue q;
        if(a[1]%k) q.push(a[1]%k);
        int i=2;
        for(i=2;i<=n;i++){
            if(cnt>0){
                cnt+=a[i]/k;
                if(a[i]%k) q.push(a[i]%k);
                cnt--;
                ans+=a[i];
            }else{
                break;
            }
        }
        for(;i<=n;i++){
            ll x=q.top();
            q.pop();
            ans+=(k-x)+a[i];
            q.push(a[i]);
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

你可能感兴趣的:(贪心)