CF985C题解
思路
由题意得知,现在有 $n\times k$ 块木板需要组装成 $n$ 个木桶,每个木桶由 $k$ 块板组成,容量服从短板原理,要求容量差不得超过 $I$,求最大容量和。
不管采用什么方法,无疑我们首先需要将板长(数组 $a$)从小到大排列。
利用贪心算法。先找出与 $a_0$ 的长度差不超过 $l$ 的木板 $i$,$0 \le i \le index$ 如果 $index$ 不超过 $n$(桶的数目),说明无法组装成满足题目条件的桶,输出 $0$。每次从这些木板中取出尽可能多的木板(上限为 $k$)组装在同一个桶,假使剩下的木板数量仍不少于尚待组装的木桶的数目。
代码
#include <iostream>
#include <algorithm>
using namespace std;
unsigned long long maxVol()
{
int n, k, l; // n个桶,每个桶k块板,桶容量差不超过l
cin >> n >> k >> l;
unsigned long long int a[n * k]; // 板长
for(int i = 0; i < n * k; i++)
cin >> a[i];
sort(a, a + n * k);
int index = 0;
while(a[index] - a[0] <= l && index < n * k)
index++;
if(index < n)
return 0;
unsigned long long int sum = 0;
int i = 0;
while(n != 0)
{
sum += a[i];
if(index - i - n >= k)
i += k;
else
i = index - n + 1;
n--;
}
return sum;
}
int main()
{
cout << maxVol() << endl;
return 0;
}
标签:index,木板,int,题解,组装,long,CF985C
From: https://www.cnblogs.com/IOIAKmerlin/p/17832514.html