zoukankan      html  css  js  c++  java
  • C. Liebig's Barrels

    You have m = n·k wooden staves. The i-th stave has length ai. You have to assemble nbarrels 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.

    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 ≤ 105,1 ≤ n·k ≤ 105, 0 ≤ 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 and1 ≤ 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堆数,每堆数的最小值相差不能大于limit ,

    求出n堆数最小值的和

    upper_bound 返回的是第一个大于的数,减去1就是小于等于的数了

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 1e5 + 10;
     4 long long a[maxn];
     5 int n, k, limit;
     6 int main() {
     7     scanf("%d%d%d", &n, &k, &limit);
     8     for (int i = 0 ; i < n * k ; i++)
     9         scanf("%lld", &a[i]);
    10     sort(a, a + n * k );
    11     int temp = upper_bound(a, a + n * k, a[0] + limit) - a;
    12     long long ans = 0;
    13     int sum = n * k;
    14     if (temp >= n) {
    15         int temp1=temp;
    16         while(sum > temp && sum - temp >= k - 1) {
    17             sum -= k - 1;
    18             ans += a[--temp1];
    19         }
    20         for (int i = 0 ; i * k < temp1 ; i++)
    21             ans += a[i * k];
    22     }
    23     printf("%lld
    ", ans);
    24     return 0;
    25 }
  • 相关阅读:
    Python 模块 itertools
    Python 字符串的encode与decode
    python 模块 hashlib(提供多个不同的加密算法)
    暴力尝试安卓gesture.key
    hdu 1300 Pearls(DP)
    hdu 1232 畅通工程(并查集)
    hdu 1856 More is better(并查集)
    hdu 1198 Farm Irrigation(并查集)
    hdu 3635 Dragon Balls(并查集)
    hdu 3038 How Many Answers Are Wrong(并查集)
  • 原文地址:https://www.cnblogs.com/qldabiaoge/p/9071432.html
Copyright © 2011-2022 走看看