Codeforces Round#652(Div.2)C.RationalLee(欲張り)

3128 ワード

タイトルリンク:https://codeforces.com/contest/1369/problem/C
に言及
$n$の個数を$k$個人に分け、一人当たり$w_を分けます.i$個数($sum_{i=1}^{k}w_i=n$)は、それぞれの人の快楽値が数の最小値と最大値の和に分けられ、すべての人の快楽値の和の最大値が計算される.
問題解
$n$の個数を小さいものから大きいものに並べ替えて両側から加算し、大きな$w_を利用するi$はできるだけ小さな値をスキップします.
コード#コード#
#include 
using ll = long long;
using namespace std;

void solve() {
    int n, k; cin >> n >> k;
    int a[n] = {};
    for (int i = 0; i < n; i++)
        cin >> a[i];
    int w[k] = {};
    for (int i = 0; i < k; i++)
        cin >> w[i];
    sort(a, a + n);
    sort(w, w + k, greater<int>());
    ll ans = 0;
    int l = 0, r = n - k;
    for (int i = 0; i < k; i++) {
        if (w[i] == 1) {
            ans += a[r] + a[r];
            ++r;
        } else {
            ans += a[l++] + a[r++];
            l += w[i] - 2; //      
        }
    }
    cout << ans << "
"; } int main() { int t; cin >> t; while (t--) solve(); }