Submission #497269

#TimeUsernameProblemLanguageResultExecution timeMemory
497269RandomLBKnapsack (NOI18_knapsack)C++17
100 / 100
41 ms3656 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3", "unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<int, int> pi; typedef pair<ll, ll> pll; typedef pair<double, double> point; typedef tuple<int, int, int> tp; //-------LL typedef unordered_set<ll> uset; typedef priority_queue<pll, vector<pll>, greater<pll>> djk; typedef long long C; typedef complex<C> P; #define pb push_back #define ms(a,b) memset(a,b,sizeof(a)) #define maxE(a) *max_element(a, a+sizeof(a)/sizeof(a[0])) #define minE(a) *min_element(a, a+sizeof(a)/sizeof(a[0])) #define F first #define S second #define siz(a) (int)a.size() #define len(a) (int)a.length() #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define bits(x) __builtin_popcount(x) #define vvll vector<vector<ll>> #define FOR(a, n) for (int a = 0; a < n; a++) #define fin(s) {cout << s << "\n"; return;} #define finm(s) {cout << s << "\n"; return 0;} #define X real() #define Y imag() #define deb(...) logger(#__VA_ARGS__, __VA_ARGS__) template<typename ...Args> void logger(string vars, Args&&... values) { cout << vars << " = "; string delim = ""; (..., (cout << delim << values, delim = ", ")); cout << endl; } template<class T> istream& operator >> (istream& is, complex<T>& p) { T value; is >> value; p.real(value); is >> value; p.imag(value); return is; } const int INF = 0x3f3f3f3f; const ll LLINF = 0x3f3f3f3f3f3f3f3f; const ll MOD = 1e9+7; const double pie = 2*acos(0.0); //------------------------------------------------------------ const int MAX = 2005; int dp[MAX]; vector<pi> use[MAX]; int main(){ cin.tie(0)->sync_with_stdio(0); int s, n; cin >> s >> n; bool curr = 1; for (int i = 1; i <= n; i++){ int v, w, k; cin >> v >> w >> k; use[w].pb({v, k}); } for (int i = 1; i <= s; i++){ sort(rall(use[i])); int curr = 0; for (int j = 0; j < siz(use[i]); j++){ curr += use[i][j].S; if (curr >= s/i){ while (siz(use[i]) > j+1) use[i].pop_back(); break; } } } for (int i = 1; i <= s; i++){ for (auto[v, k]: use[i]){ k = min(k, s/i); int curr = 0; while (k){ int sz = min((1<<curr), k); curr++; for (int j = s; j >= i*sz; j--) dp[j] = max(dp[j], dp[j-i*sz] + sz*v); k -= sz; } } } cout << dp[s] << "\n"; } /* stuff you should look for * int overflow, array bounds * test case inputs don't carry over (DON'T RETURN EARLY) * special cases (n=1?) * do smth instead of nothing and stay organized * WRITE STUFF DOWN * DON'T GET STUCK ON ONE APPROACH */

Compilation message (stderr)

knapsack.cpp: In function 'int main()':
knapsack.cpp:61:10: warning: unused variable 'curr' [-Wunused-variable]
   61 |     bool curr = 1;
      |          ^~~~
#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...