D. Colored Balls

纯粹的發表於2024-06-28

原題連結

題解

1.假設有k類球,當這k類球中數量最多的那一類的數量為m,若m不超過總數的一半,那麼答案就是總數的一半+總數的奇偶性,否則答案是m
2.由於資料很小,所以可以 \(O(n^2)\)
3.我們可以對所有的球類組合用數量最多的那一類球定義

code

// LUOGU_RID: 163214985
#include<bits/stdc++.h>
#define ll long long
const ll mod = 998244353;
using namespace std;
ll a[5005];
ll cnt[5005] = {0};

int main() {
    ll n;
    cin >> n;

    for (ll i = 1; i <= n; i++) {
        cin >> a[i];
    }

    sort(a + 1, a + 1 + n);

    ll ans = 0;
    cnt[0] = 1;

    for (ll i = 1; i <= n; i++) {
        for (ll j = 5000 - a[i]; j >= 0; j--) {
            if (cnt[j]) {
                cnt[j + a[i]] = (cnt[j + a[i]] + cnt[j]) % mod;

                if (a[i] >= j) {
                    ans = (ans + a[i] * cnt[j]) % mod;
                } else {
                    ans = (ans + ((a[i] + j + 1LL) / 2LL) * cnt[j]) % mod;
                }
            }
        }
    }

    cout << ans << endl;
    return 0;
}