CF985C 题解

发布时间 2023-11-18 19:15:13作者: merlinkkk

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;
}