hdu6709 Fishing Master(思维+贪心)

题目链接

大意:给你n条鱼每条鱼需要煮的时间,和抓一条鱼的时间k,
你每次只能抓一条鱼,煮一条鱼,问你最少多久煮完所有的鱼。
思路:显然我们必须花k的时间抓第一条鱼,而且煮鱼的时间是不能减少的,问题就是我们需要浪费多长时间,
那么如果煮鱼的时间可以抓完所有的鱼,那么我们就不需要浪费时间,煮鱼时间内我们可以抓 ∑ a i k \sum\frac{a_i}{k} kai
如果 ≥ n − 1 \geq n-1 n1,那么我们不需要浪费时间,否则少一条我们就要浪费一点时间去抓,那么我们把煮鱼时间对k取模从大到小排序取就行了,少几条就浪费几条的时间
细节见代码:

#include

#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define LL long long
#define SZ(X) X.size()
#define pii pair
#define ALL(X) X.begin(),X.end()

using namespace std;

LL gcd(LL a, LL b) {
     return b ? gcd(b, a % b) : a;}
LL lcm(LL a, LL b) {
     return a / gcd(a, b) * b;}
LL powmod(LL a, LL b, LL MOD) {
     LL ans = 1; while (b) {
     if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
const int N = 2e5 + 11;
int T, n, k, a[N], b[N];
int main() {
     
    ios::sync_with_stdio(false);
    for (cin >> T; T; T--) {
     
        cin >> n >> k;
        LL ans = 0;
        LL t = 0;
        for (int i = 1; i <= n; i++)cin >> a[i], t += a[i] / k, b[i] = a[i] % k, ans += a[i];
        sort(b + 1, b + 1 + n, [](int A, int B) {
     return A > B;});
        if (t >= n - 1) {
     
            cout << ans + k << endl;
        } else {
     
            int x = n - 1 - t;
            for (int i = 1; i <= x; i++)ans += (k - b[i]);
            cout << ans + k << endl;
        }

    }
    return 0;
}

你可能感兴趣的:(acm,思维,贪心)