Submission #1272664

#TimeUsernameProblemLanguageResultExecution timeMemory
1272664osmiyumBank (IZhO14_bank)C++20
19 / 100
73 ms8520 KiB
#include <bits/stdc++.h>
using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N, M;
    if (!(cin >> N >> M)) return 0;
    vector<int> a(N);
    for (int i = 0; i < N; ++i) cin >> a[i];
    vector<int> b(M);
    for (int i = 0; i < M; ++i) cin >> b[i];

    // prefix sums of salaries
    vector<int> pref(N+1, 0);
    for (int i = 0; i < N; ++i) pref[i+1] = pref[i] + a[i];
    int FULL = 1<<M;

    // sum[mask] : toplam değer
    vector<int> sum(FULL, 0);
    for (int mask = 1; mask < FULL; ++mask) {
        int lsb = __builtin_ctz(mask); // en düşük 1 bit pozisyonu
        int pmask = mask ^ (1<<lsb);
        sum[mask] = sum[pmask] + b[lsb];
    }

    // dp[mask] = -1 unreachable, otherwise currently paid amount to current person (0..a[cur]-1 or 0..a[cur])
    vector<int> dp(FULL, -1);
    dp[0] = 0;

    for (int mask = 0; mask < FULL; ++mask) {
        if (dp[mask] < 0) continue;
        // kaç kişinin maaşı tamamlanmış?
        int S = sum[mask];
        // upper_bound -> ilk pref > S, onun bir eksiği pref[t] <= S
        int ub = int(upper_bound(pref.begin(), pref.end(), S) - pref.begin());
        int cur = ub - 1; // cur kişiler tamamlandı
        if (cur == N) { // hepsi ödenmiş
            cout << "YES\n";
            return 0;
        }
        int paid = dp[mask]; // şu anki kişiye ödenmiş miktar = S - pref[cur]
        // deneyelim hangi banknotu ekleyebiliriz
        for (int j = 0; j < M; ++j) if (!(mask & (1<<j))) {
            int need = a[cur];
            if (paid + b[j] <= need) {
                int nm = mask | (1<<j);
                dp[nm] = max(dp[nm], paid + b[j]);
            }
        }
    }

    // hiçbiri tüm maaşları ödeyemedi
    cout << "NO\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...