제출 #331599

#제출 시각아이디문제언어결과실행 시간메모리
331599wind_reaperKnapsack (NOI18_knapsack)C++17
100 / 100
151 ms10516 KiB
// #define _GLIBCXX_DEBUG // #pragma GCC optimize "trapv" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <chrono> // #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") // pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native") using namespace std; using namespace __gnu_pbds; using namespace chrono; #define pb push_back #define f first #define s second #define min3(a, b, c) min(min(a, b), c) #define max3(a, b, c) max(max(a, b), c) #define all(v) v.begin(), v.end() typedef long long ll; typedef double ld; typedef long double lld; typedef unsigned long long ull; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi; typedef vector<vi> vvi; typedef vector<ll> vl; typedef vector<vl> vvl; typedef vector<pii> vpi; typedef vector<pll> vpl; template <class T> using ordered_set = tree <T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>; const int INF = 1e9; // const ll INF = 1e18; const ll mod = 1000000007; // const ll mod = 998244353; void solve(int tc){ int s, n; cin >> s >> n; vvl val(s+1); for(int i = 0; i < n; i++){ ll v, w, k; cin >> v >> w >> k; ll sum = 0; ll m = 1; while(true){ sum += m; if(sum > k){sum -= m; break;} if(m*w <= s) val[m*w].pb(m*v); else break; m *= 2; } if(sum < k && (k - sum)*w <= s) val[w*(k - sum)].pb(v*(k - sum)); } vector<pair<ll, int>> fin; for(int i = 1; i <= s; i++){ sort(val[i].rbegin(), val[i].rend()); for(int j = 0; j < min((int)val[i].size(), s/i); j++) fin.pb({val[i][j], i}); } vl dp(s+1); for(int i = 0; i < fin.size(); i++){ ll v = fin[i].f; int w = fin[i].s; for(int W = s - w; W >= 0; --W) dp[W + w] = max(dp[W + w], dp[W] + v); } cout << *max_element(all(dp)) << '\n'; } int main(){ ios_base::sync_with_stdio(NULL); cin.tie(NULL); #ifdef LOCAL auto begin = high_resolution_clock::now(); #endif int tc = 1; // cin >> tc; for (int t = 0; t < tc; t++) solve(t); #ifdef LOCAL auto end = high_resolution_clock::now(); cout << fixed << setprecision(4) << "Execution Time: " << duration_cast<duration<double>>(end - begin).count() << "seconds" << endl; #endif return 0; }

컴파일 시 표준 에러 (stderr) 메시지

knapsack.cpp: In function 'void solve(int)':
knapsack.cpp:73:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |  for(int i = 0; i < fin.size(); 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...