Submission #1304316

#TimeUsernameProblemLanguageResultExecution timeMemory
1304316s3yoonparkKnapsack (NOI18_knapsack)C++20
73 / 100
191 ms280024 KiB
#include <bits/stdc++.h>
using namespace std; 
#define int long long 

#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

void solve() 
{
    int n, s; 
    cin >> s >> n; 
    vector<int> price(n + 1), page(n + 1), num(n + 1); 
    vector mp(s + 1, vector<pair<int,int>>{});
    for (int i = 1; i <= n; i++) 
    {
        cin >> page[i] >> price[i] >> num[i]; 
        mp[price[i]].emplace_back(page[i], num[i]); 
    } 
    
    vector<int> newPrice; 
    vector<int> newPage; 
    for (int i = 1; i <= s; i++)
    {
        sort(mp[i].rbegin(), mp[i].rend()); 
        int cnt = 1; 
        for (auto [a, b] : mp[i])
        {
            for (int it = 1; it <= b; it++)
            {
                newPrice.push_back(i); 
                newPage.push_back(a); 
                ++cnt; 
                if (cnt == (s + i - 1) / i + 1) break; 
            }
            if (cnt == (s + i - 1) / i + 1) break; 
        }
    }

    int m = newPrice.size(); 
    newPrice.insert(newPrice.begin(), 0); 
    newPage.insert(newPage.begin(), 0); 

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

    for (int i = 1; i <= m; i++)
    {
        for (int j = 0; j <= s; j++)
        {
            dp[i][j] = dp[i - 1][j]; 
            if (j >= newPrice[i]) dp[i][j] = max(dp[i][j], dp[i - 1][j - newPrice[i]] + newPage[i]); 
        }
    }

    cout << dp[m][s] << '\n'; 
}   

signed main() 
{
    ios_base::sync_with_stdio(false); 
    cin.tie(nullptr);
    int tc = 1;
    // cin >> tc; 
    while (tc--) solve(); 
    return 0; 
}

//  dp[i][j] = maximum number of pages i can buy having bought considering first i distinct books and with j money
//  dp[i][j] = dp[i - 1][j - (0..k[i]) * h[i]] + (0..k[i]) * s[i] 
//  dp[i - 1][ j - (0...k[i]) * h[i] ] + (0...k[i]) * s[i]  
#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...