問題の意味の分析
質問の意味:タイトル与えられたn個の魚、魚をキャッチし、時間kを使用し、仕上げグラブを尋ねると、最短時間にすべての魚を調理し、各魚は調理時間を与えます。
トピックリンク添付
アイデアを:
1.キャッチ時の最初の魚は避けられない、それぞれの魚は調理時間をは避けられ、これらはカウントしなければなりません。
2.朱ゆうを最適化することができる他の魚に許される時間がキャッチすることができる範囲内で、時間です。もちろん、追加の時間を必要と魚、おそらくいない他の魚をキャッチするのに十分な時間を、沸騰させました。
3.各魚を調理する調理時間内に配置された魚の最大数は、CNT、釣り時間コストをキャッチされ、各追加時刻が配列に格納され、[] FREと呼びます。
4.詳細はコードに示されています。
ACコード
/*贪心*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = int(1e5+10);
int T, n, k;
int cnt; //在煮鱼期间最多能钓上来的鱼数
int t[maxn], fre[maxn];
LL cost;
int main()
{
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &k);
cost = k; //捕第一条鱼的时间不可避免
cnt = 0;
memset(t, 0, sizeof(t));
memset(fre, 0, sizeof(fre));
for(int i = 0; i < n; i++)
{
scanf("%lld", &t[i]);
cost += t[i]; //煮鱼的时间不可避免
cnt += t[i] / k;
fre[i] = k - t[i] % k; //k - 每次煮鱼的时间所剩余的可利用时间 = 多投入的时间
}
if(cnt < n - 1)
{
sort(fre, fre + n);
for(int i = 0; i < n - 1 - cnt; i++) //贪心思想,从小往大加
cost += fre[i];
}
printf("%lld\n", cost);
}
}