题目链接: Fishing Master
大致题意:
湖里有n条鱼, 每钓一条鱼需要花费的时间为m(可以选择钓第几条鱼). 只能同时烹饪一条鱼, 烹饪第i条鱼所花费的时间至少为a[i], 可以在烹饪的期间去捕鱼. 问最少需要花费多少时间将n条鱼烹饪完毕.
解题思路:
贪心算法
最理想的情况下, 需要花费的时间res = m + 烹饪所有鱼的时间总和.
但是有的情况下, 我们并不能在烹饪每条鱼时都恰好能去钓鱼, 所以我们需要将有些鱼多烹饪一些时间, 去额外钓一些鱼. 我们要做的也就是去尽可能的减少额外花费的时间.
当我们烹饪第i条鱼时, 我们可以不花费任何额外的时间钓鱼的数目为a[i] / m, 剩余的时间则为a[i] % m, 我们可以统计是否我们可以不花费任何额外时间钓完所有鱼, 如果不可以, 则我们需要在剩余时间最多的鱼烹饪后多花去m - a[i] % m的时间.
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, n) for (int i = 1; i <= n; ++i)
const int N = 1E5 + 10;
int a[N];
int main()
{
int t; cin >> t;
while (t--) {
vector<int> b; //放剩余时间
int n, m; scanf("%d %d", &n, &m);
ll res = m; int cou = 1; //起初我们至少要m的时间, 抓一条鱼
rep(i, n) scanf("%d", &a[i]), res += a[i], cou += a[i] / m, b.push_back(a[i] % m);
sort(b.begin(), b.end(), greater<int>());
for (int i = 1; i <= n - cou; ++i) res += m - b[i - 1];
cout << res << endl;
}
return 0;
}
洗手间, 永远滴神!