HDU 6709 Fishing Master 贪心

首先假设我能够在炖鱼的时候把所有的鱼抓完,那么最少只需要 k + ∑ i = 1 n t [ i ] k+\sum_{i=1}^{n}t[i] k+i=1nt[i]的时间就可以完成。
现在注意到可能在炖鱼的时候无法抓完所有的鱼,也就是 ∑ i = 1 n t [ i ] k ≤ n − 1 \sum_{i=1}^{n}\frac{t[i]}{k}\leq n-1 i=1nkt[i]n1的情形,对于剩下来的一部分鱼,我可以在炖鱼的时候选择一段补全多抓一条鱼,这个时间是 k − t [ i ] % k k-t[i]\%k kt[i]%k,对 t [ i ] % k t[i]\%k t[i]%k从大到小排序,加上我剩下的鱼需要的时间即为答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll INF=LONG_LONG_MAX;
const int N=1e5+7;
int a[N];  
int main() {
	int T;
	scanf("%d",&T);
	while(T--) {
		int n,k;
		scanf("%d%d",&n,&k);
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		ll ans=k,ok=0;
		for(int i=1;i<=n;i++)
			ok+=a[i]/k;
		if(ok>=n-1) {
			for(int i=1;i<=n;i++)
				ans+=a[i];
			printf("%lld\n",ans);
		}
		else {
			for(int i=1;i<=n;i++) 
				ans+=a[i],a[i]%=k;
			sort(a+1,a+1+n,greater<int>());
			for(int i=1;i<=n-1-ok;i++)
				ans+=k-a[i];
			printf("%lld\n",ans); 
		} 
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值