Submission #1303643

#TimeUsernameProblemLanguageResultExecution timeMemory
1303643sritthebossKnapsack (NOI18_knapsack)C++20
100 / 100
63 ms34356 KiB
#include "bits/stdc++.h"
#define ll long long
using namespace std;

const ll MOD = 1e9+7;
const int MAXN = 2e6;

long long fac[MAXN + 1];
long long inv[MAXN + 1];

void setFileIO(const string& filename) {
    freopen((filename + ".in").c_str(), "r", stdin);
    freopen((filename + ".out").c_str(), "w", stdout);
}

ll gcd(ll a, ll b) {
    return b == 0 ? a : gcd(b, a % b);
}

long long exp(long long x, long long n, long long m) {
    x %= m;  // note: m * m must be less than 2^63 to avoid ll overflow
    long long res = 1;
    while (n > 0) {
        if (n % 2 == 1) { res = res * x % m; }
        x = x * x % m;
        n /= 2;
    }
    return res;
}

void factorial(long long p) {
    fac[0] = 1;
    for (int i = 1; i <= MAXN; i++) { fac[i] = fac[i - 1] * i % p; }
}

void inverses(long long p) {
    inv[MAXN] = exp(fac[MAXN], p - 2, p);
    for (int i = MAXN; i >= 1; i--) { inv[i - 1] = inv[i] * i % p; }
}

long long choose(long long n, long long r, long long p) {
    return fac[n] * inv[r] % p * inv[n - r] % p;
}

int first_true(int lo, int hi, function<bool(int)> f) {
    hi++;
    while (lo < hi) {
        int mid = lo + (hi - lo) / 2;
        if (f(mid)) {
            hi = mid;
        } else {
            lo = mid + 1;
        }
    }
    return lo;
}

int last_true(int lo, int hi, function<bool(int)> f) {
    lo--;
    while (lo < hi) {
        int mid = lo + (hi - lo + 1) / 2;
        if (f(mid)) {
            lo = mid;
        } else {
            hi = mid - 1;
        }
    }
    return lo;
}

void solve() {

    ll s, n;
    cin >> s >> n;

    vector<vector<pair<ll, ll>>> items(2001);
    vector<ll> sizes(2001);

    for (ll i = 1; i <= n; i++) {
        ll a, b, c;
        cin >> a >> b >> c;
        items[b].push_back({a, c});
    }

    for (ll i = 1; i <= s; i++) {
        sort(items[i].begin(), items[i].end(), [](const pair<ll, ll>& a, const pair<ll, ll>& b) {
            return a.first > b.first;
        });
    }

    vector<vector<ll>> dp(s+1, vector<ll>(s+1, 0));


    for (ll i = 1; i <= s; i++) {

        if (items[i].empty()) {
            for (int j = 1; j <= s; j++) {
                dp[i][j] = dp[i - 1][j];
            }
        } else {
            for (ll j=1; j <= s; j++) {
                ll k = 0;
                ll l = 0;
                ll prev = 0;
                ll cumulative_cost = 0;
                while (k*i <= j && !items[i].empty()) {
                    dp[i][j] = max(dp[i][j], dp[i-1][j-k*i] + cumulative_cost);
                    k++;
                    if (k-prev > items[i][l].second) {
                        prev = k-1;
                        l++;
                        if (l >= items[i].size()) break;
                    }

                    cumulative_cost += items[i][l].first;

                }
            }
        }
    }

    cout << dp[s][s] << endl;

}


// Pay attention to constraints
// Do not tunnel vision on one approach
// Do something rather than nothing


int main() {

    cin.tie(0);
    ios_base::sync_with_stdio(false);

    // int t;
    // cin >> t;
    // while (t--) {
         solve();
    // }
}

Compilation message (stderr)

knapsack.cpp: In function 'void setFileIO(const std::string&)':
knapsack.cpp:12:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 |     freopen((filename + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
knapsack.cpp:13:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   13 |     freopen((filename + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...