Skip to content

Commit 36d578f

Browse files
committed
atcoder/abc060D (feedback from editorial)
1 parent 448b049 commit 36d578f

File tree

1 file changed

+25
-13
lines changed

1 file changed

+25
-13
lines changed

atcoder/abc060/D/main.cpp

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,36 @@ int N, W;
77
vector<int> wss, vss;
88

99
int solve() {
10-
map<int,int> dp;
11-
dp[0] = 0;
10+
vector<deque<int>> v(4);
1211

13-
for (int i = 0; i < N; ++i) {
14-
auto ndp = dp;
15-
for (auto e : dp) {
16-
auto w = e.first, v = e.second;
17-
int nw = w + wss[i];
18-
int nv = v + vss[i];
19-
if (nw > W) continue;
20-
ndp[nw] = max(ndp[nw], nv);
12+
v[0].push_back(vss[0]);
13+
for (int i = 1; i < N; ++i) {
14+
int dw = wss[i] - wss[0];
15+
assert(dw >= 0 && dw <= 3);
16+
v[dw].push_back(vss[i]);
17+
}
18+
19+
for (int i = 0; i < 4; ++i) {
20+
sort(v[i].begin(), v[i].end());
21+
reverse(v[i].begin(), v[i].end());
22+
v[i].push_front(0);
23+
for (int j = 1; j < v[i].size(); ++j) {
24+
v[i][j] += v[i][j-1];
2125
}
22-
dp = ndp;
2326
}
2427

2528
int ans = 0;
26-
for (auto e : dp) {
27-
ans = max(ans, e.second);
29+
for (int i = 0; i < v[0].size(); ++i) {
30+
for (int j = 0; j < v[1].size(); ++j) {
31+
for (int k = 0; k < v[2].size(); ++k) {
32+
for (int l = 0; l < v[3].size(); ++l) {
33+
ll ww = ll(wss[0])*i + ll(wss[0]+1)*j + ll(wss[0]+2)*k + ll(wss[0]+3)*l;
34+
int vv = v[0][i] + v[1][j] + v[2][k] + v[3][l];
35+
if (ww > W) continue;
36+
ans = max(ans, vv);
37+
}
38+
}
39+
}
2840
}
2941
return ans;
3042
}

0 commit comments

Comments
 (0)