【HDU6709】Fishing

题目大意:有 N 条鱼,每条鱼都有钓鱼和烤鱼的时间,钓鱼的时间均相同,每条鱼都有自己的烤鱼时间,一次只能烤一条鱼,且不能间断。现要求通过某种顺序将所有的鱼钓上来并烤完,求最小的时间是多少。

题解:
对于顺序可以自选的情况,可以从全局的角度进行考虑。对于最终状态,每条鱼被烤的时间和钓鱼的总次数是固定的,且一定要先钓上来一条鱼。最好情况就是所有的其他鱼均可以在烤鱼的时候钓上来。不过,可能会存在一些烤鱼的时间无法满足钓上来一整条鱼的时间。因此,可能会出现正在钓鱼但是锅里没有鱼的情况,这部分时间是被浪费的时间。那么,我们只需要使得这部分的时间最小即可,即:用这些最小的时间去钓鱼,其他剩余的时间等待,保证总有鱼在锅里煮。

代码如下

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

int main() {
	int T;
	scanf("%d", &T);
	while (T--) {
		static int n, k;
		scanf("%d %d", &n, &k);
		vector<int> t(n + 1), waste(n + 1);
		LL ans = k;
		int cnt = 0;
		for (int i = 1; i <= n; i++) {
			scanf("%d", &t[i]);
			ans += t[i];
			cnt += t[i] / k;
			waste[i] = k - t[i] % k;
		}
		if (cnt >= n - 1) {
			printf("%lld\n", ans);
		} else {
			sort(waste.begin(), waste.end());
			int need = n - 1 - cnt;
			for (int i = 1; i <= need; i++) {
				ans += waste[i];
			}
			printf("%lld\n", ans);
		}
	}
	return 0;
}
posted @ 2019-08-28 17:36  shellpicker  阅读(241)  评论(0编辑  收藏  举报