赞
踩
二分加贪心。先确保前 i 桶可以分配为相邻的 k 个,并且保证 a[i∗k+j]−a[1]<=l,这样就能保证所有的差不大于 l,如果不能保证这个条件,说明此时已经无法分配相邻的 k 个了,而需要将剩下的没有组装的桶先分配一个满足条件的最大的,然后剩下的再分给这些没有组装完成的桶(当然这部分不用代码写出来)。
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int MAXN = 1e5 + 10;
int n, k, l;
int a[MAXN];
int main(int argc, const char * argv[])
{
cin >> n >> k >> l;
int tmp = n * k;
for (int i = 1; i <= tmp; i++)
{
scanf("%d", a + i);
}
sort(a + 1, a + tmp + 1);
if (a[n] - a[1] > l)
{
cout << "0\n";
}
else
{
long long ans = 0;
for (int i = 1, j = n - 1; i <= n; i++, j--)
{
if (a[i * k + j] - a[1] <= l)
{
ans += a[(i - 1) * k + 1];
}
else
{
int p = (int)(upper_bound(a + (i - 1) * k + 1, a + tmp + 1, a[1] + l) - a - 1);
ans += a[(i - 1) * k + 1];
while (j--)
{
ans += a[p--];
}
break;
}
}
cout << ans << '\n';
}
return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。