📂题解
🔖题解
2023-11-18 19:05阅读: 22评论: 0推荐: 0

CF985C 题解

CF985C题解

思路

由题意得知,现在有 n×k 块木板需要组装成 n 个木桶,每个木桶由 k 块板组成,容量服从短板原理,要求容量差不得超过 I,求最大容量和。

不管采用什么方法,无疑我们首先需要将板长(数组 a)从小到大排列。

利用贪心算法。先找出与 a0 的长度差不超过 l 的木板 i0iindex 如果 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;
}

本文作者:merlinkkk

本文链接:https://www.cnblogs.com/merlinkkk/p/17832514.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   merlinkkk  阅读(22)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开