CF985C 题解

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;
}
posted @ 2023-11-18 19:05  merlinkkk  阅读(77)  评论(0)    收藏  举报