Submission #1253404

#TimeUsernameProblemLanguageResultExecution timeMemory
1253404thanhcodedaoKnapsack (NOI18_knapsack)C++17
100 / 100
35 ms5192 KiB
/****ThanhCodeDao*****/ /*******Azazel*******/ #include<bits/stdc++.h> using namespace std; #define F first #define S second #define pb push_back #define checkbit(mask,i) ((mask>>i)&1) #define bit(i) (1<<i) #define MLog 21 typedef long long ll; const ll maxN = 1e5+3, modd = 1e9+7; struct Point { ll x,y; }; ll cross(Point p,Point q,Point r) { // vi tri r voi duong pq >0 la ben trai, =0 la thang hang ll val = (q.x-p.x)*(r.y-q.y) - (q.y-p.y)*(r.x-q.x); if(val < 0) return -1; if(val > 0) return 1; return 0; } ll dot(Point vecA,Point vecB) { // tra ve >0 la nhon, <0 la tu, =0 la vuong, 2 vecto phai chung goc ll val = vecA.x*vecB.x + vecA.y*vecB.y; if(val < 0) return -1; if(val > 0) return 1; return 0; } double triarea(Point p,Point q,Point r) { // cross(pq * pr) / 2 double cross = (q.x-p.x)*(r.y-q.y) - (q.y-p.y)*(r.x-q.x); return fabs(cross)/2.0; } ll f[2003]; int s,n; ll v[maxN], w[maxN],k[maxN]; // knapsack vo han su dung nhi phan hoa de toi uu, dpt n*log2(k)*s (co the giam nhieu vi s >= k*w) void sub1234() { for(int i = 1; i<=n; i++) { for(int j = 1; k[i] > 0; j <<= 1) { ll get = min(k[i],1ll*j); // vd 4 thi sau khi lay 2^0 va 2^1 van con 2^0 co the lay k[i] -= get; ll val = get * v[i], cost = get * w[i]; for(int x = s; x>=cost; x--) { f[x] = max(f[x],f[x-cost] + val); } } } ll ans = 0; for(int i = 1; i<=s; i++) ans = max(ans,f[i]); cout << ans; } vector<pair<ll,ll>> sameW[2003]; void solve() { cin >> s >> n; for(int i = 1; i<=n; i++) { cin >> v[i] >> w[i] >> k[i]; sameW[w[i]].pb({v[i],k[i]}); } for(int w = s; w>=1; w--) { sort(sameW[w].begin(),sameW[w].end(),greater<pair<ll,ll>>()); vector<ll> firstk(s / w + 5); firstk[0] = 0; int cnt = 0; for(pair<ll,ll> item : sameW[w]) { for(int j = 1; j<=item.S; j++) { ++cnt; if(cnt * w > s) break; firstk[cnt] = firstk[cnt-1] + item.F; } } for(int x = s; x>=0; x--) { // n log2 n for(int j = 1; j*w <= x; j++) { f[x] = max(f[x],f[x - j*w] + firstk[j]); } } } ll ans = 0; for(int i = 1;i<=s;i++) ans = max(ans,f[i]); cout << ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(0), cout.tie(0); //freopen("inp.txt","r",stdin); //freopen("out.txt","w",stdout); solve(); return 0; }
#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...