# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
993120 | cpdreamer | Knapsack (NOI18_knapsack) | C++17 | 1 ms | 604 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <utility>
using namespace __gnu_pbds;
using namespace std;
typedef tree<int,null_type,less<int>,rb_tree_tag,
tree_order_statistics_node_update> indexed_set;
const int max_n=INT_MAX;
typedef long long ll;
#define LLM LONG_LONG_MAX
#define pb push_back
#define F first
#define L length()
#define all(v) v.begin(),v.end()
#define P pair
#define V vector
#define S second
const long long MOD = 1000000007; // 1e9 + 7
void file(){
freopen("input.txt.txt","r",stdin);
freopen("output.txt.txt","w",stdout);
}
void setio(string s) {
freopen((s + ".in").c_str(), "r", stdin);
freopen((s + ".out").c_str(), "w", stdout);
}
bool is_sorted(int A[],int n) {
for (int i = 0; i < n - 1; i++) {
if (A[i] > A[i + 1])
return false;
}
return true;
}
void solve() {
int W, n;
cin >> W >> n;
int v[n], k[n], w[n];
V<V<P<ll, ll>>> vp(W + 1);
V<V<P<ll, ll>>> pref(W + 1);
for (int i = 0; i < n; i++) {
cin >> v[i] >> w[i] >> k[i];
vp[w[i]].pb({v[i], k[i]});
}
ll dp[W + 1];
bool made[W + 1];
memset(dp, -1, sizeof(dp));
memset(made, false, sizeof(dp));
dp[0] = 0;
made[0] = true;
for (int i = 1; i <= W; i++) {
sort(all(vp[i]));
reverse(all(vp[i]));
}
for (int i = 1; i <= W; i++) {
if (!vp[i].empty()) {
pref[i].pb({vp[i][0].F*vp[i][0].S,vp[i][0].S});
for (int j = 1; j < vp[i].size(); j++) {
pref[i].pb({vp[i][j].F*vp[i][j].S + pref[i][j - 1].F, vp[i][j].S + pref[i][j - 1].S});
}
}
}
for (int i = 1; i <= W; i++) {
if (!vp[i].empty()) {
for (int j = W; j >= i; j--) {
int weight = j;
int l = 0, r = (int)pref[i].size() - 1;
int ans = -1;
while (l <= r) {
int m = l + (r - l) / 2;
if (pref[i][m].S * i >= j) {
ans = m;
r = m - 1;
} else
l = m + 1;
}
if (ans == -1)
ans = (int) vp[i].size() - 1;
int a = 0;
ll value=0;
if (ans > 0) {
a = (int) pref[i][ans - 1].S * i;
value = (int) pref[i][ans - 1].F;
}
weight -= a;
int add = min((weight / i),(int)vp[i][ans].S);
a += add*i;
value+=(int) vp[i][ans].F * add;
if (made[j - a]) {
made[j] = true;
dp[j] = max(dp[j], dp[j - a] + value);
}
}
}
}
cout << *max_element(dp, dp + W + 1) << endl;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//file();
solve();
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |