Pagini recente » Cod sursa (job #298696) | Cod sursa (job #2681974) | Cod sursa (job #2725303) | Cod sursa (job #1099021) | Cod sursa (job #2706226)
#include <bits/stdc++.h>
using namespace std;
const int MAXW = 200;
struct Queue {
vector<int> d;
int ptr = 0;
void Push(int x) {
while (d.size() && d.back() > x)
d.pop_back();
d.push_back(x);
}
void Pop(int x) {
if (d[ptr] == x) ++ptr;
}
int Min() { return d[ptr]; }
};
int main() {
ifstream cin("ghiozdan.in");
ofstream cout("ghiozdan.out");
int n, g; cin >> n >> g;
vector<int> freq(MAXW + 1, 0);
for (int i = 0; i < n; ++i) {
int x; cin >> x; freq[x] += 1;
}
vector<int> dp(g + 1, 1e9), ndp(dp);
Queue Q;
dp[0] = 0;
for (int w = 1; w <= MAXW; ++w) {
int have = freq[w];
if (have == 0) continue;
for (int rem = 0; rem < w; ++rem) {
Q.d.clear(); Q.ptr = 0;
for (int div = 0; div * w + rem <= g; ++div) {
int pos = div * w + rem;
if (div > 0)
ndp[pos] = min(dp[pos], Q.Min() + div);
else ndp[pos] = dp[pos];
Q.Push(dp[pos] - div);
if (div >= have)
Q.Pop(dp[pos - have * w] - (div - have));
}
}
swap(dp, ndp);
}
for (int gg = g; gg >= 0; --gg) {
int cnt = dp[gg];
if (cnt <= n) {
cout << gg << " " << cnt << endl;
while (cnt--) {
int w = 0;
while (dp[gg] != cnt || freq[w] == 0) ++w, --gg;
cout << w << '\n';
--freq[w];
}
return 0;
}
}
}