time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

You have m = n·k wooden staves. The i-th stave has length ai. You have to assemble n barrels consisting of k staves each, you can use any k staves to construct a barrel. Each stave must belong to exactly one barrel.

Let volume vj of barrel j be equal to the length of the minimal stave in it.

Educational Codeforces Round 44 (Rated for Div. 2) C. Liebig's Barrels

You want to assemble exactly n barrels with the maximal total sum of volumes. But you have to make them equal enough, so a difference between volumes of any pair of the resulting barrels must not exceed l, i.e. |vx - vy| ≤ l for any 1 ≤ x ≤ n and 1 ≤ y ≤ n.

Print maximal total sum of volumes of equal enough barrels or 0 if it's impossible to satisfy the condition above.

Input

The first line contains three space-separated integers nk and l (1 ≤ n, k ≤ 1051 ≤ n·k ≤ 1050 ≤ l ≤ 109).

The second line contains m = n·k space-separated integers a1, a2, ..., am (1 ≤ ai ≤ 109) — lengths of staves.

Output

Print single integer — maximal total sum of the volumes of barrels or 0 if it's impossible to construct exactly n barrels satisfying the condition |vx - vy| ≤ l for any 1 ≤ x ≤ n and 1 ≤ y ≤ n.

Examples
input
Copy
4 2 1
2 2 1 2 3 2 2 3
output
Copy
7
input
Copy
2 1 0
10 10
output
Copy
20
input
Copy
1 2 1
5 2
output
Copy
2
input
Copy
3 2 1
1 2 3 4 5 6
output
Copy
0
Note

In the first example you can form the following barrels: [1, 2][2, 2][2, 3][2, 3].

In the second example you can form the following barrels: [10][10].

In the third example you can form the following barrels: [2, 5].

In the fourth example difference between volumes of barrels in any partition is at least 2 so it is impossible to make barrels equal enough.

题意:n个水桶,每个桶k快板,且装水具有短板效应,所有桶之间能装的水不能超过l,求出n个桶最大总装水量的拼装桶的方式,共给你k*n快板

题解:贪心,排一下序,upper_bound找出排序后a[0]到a[0]+l这部分有多少块板pos,每个桶的最短板必须从这里面取,当pos<n的时候就不满足n个桶之间装水量<=l了。当pos==n时,这部分班对应n个桶的最短板,当pos>n时,要使短板经量的大,所以小的板经量组装在一个桶,既依次取最短板a[0],a[0+k},a[0+2k].....,又最短板只能从0到pos内取,所以再从pos-1,一直往下取,直到取了n快最短板

注意:ans 会爆int,所以要用long long

代码:

#include <bits/stdc++.h>
using namespace std;
int n, k ,l;
const int M = 2e5+10;
long long a[M];
int vis[M];
long long ans;
int main()
{
cin>>n>>k>>l;
memset(vis,0,sizeof(vis));
ans =0;
for(int i=0;i<n*k;i++)
{
cin>>a[i];
}
sort(a,a+n*k);
  int pos = upper_bound(a,a+n*k,a[0]+l)-a; 
  //cout<<pos<<" "<<a[pos]<<endl;
  int p=0;
if(pos<n)
cout<<0<<endl;
else if(pos==n)
{
for(int i=0;i<pos;i++)
{
ans+=a[i];
}
cout<<ans<<endl;
}
else if(pos>n)
{
for(int i=0;i<pos;i+=k)
{
ans+=a[i];
p++;
vis[i] = 1;
if(p==n)
break;

if(p<n)
{
for(int i=pos-1;i>=0;i--)
{
if(p==n)
break;
if(vis[i])
continue;
ans+=a[i];
vis[i] = 1;
p++;
if(p==n)
break;
}
}
cout<<ans<<endl;
}
}

相关文章:

  • 2021-09-25
  • 2021-07-11
  • 2022-03-02
  • 2022-01-01
  • 2021-05-17
猜你喜欢
  • 2022-02-02
  • 2022-12-23
  • 2022-12-23
  • 2021-05-25
  • 2021-12-23
  • 2021-05-17
相关资源
相似解决方案