Pagini recente » Cod sursa (job #1694102) | Cod sursa (job #2496485) | Cod sursa (job #2528974) | Cod sursa (job #1761124) | Cod sursa (job #1829110)
#include <bits/stdc++.h>
using namespace std;
const int v_max = 2e2;
const int vmax = 2e2 + 10;
const int gmax = 75e3 + 10;
const int inf = 2e4 + 10;
int n, g;
int nr[vmax];
int dp[gmax][vmax], used[gmax][vmax];
vector < int > ans;
void input() {
scanf("%d %d", &n, &g);
for (int i = 1; i <= n; ++i) {
int x; scanf("%d", &x);
nr[x]++;
}
}
int get_dp(int p, int i, int val) {
int k = (i - p) / val;
return dp[i-k*val][val-1];
}
void update_ans(int i, int val, int p) {
int k = (i - p) / val;
if (dp[i-k*val][val-1] == inf) return;
dp[i][val] = dp[i-k*val][val-1] + k;
used[i][val] = k;
}
void compute_dp() {
for (int i = 0; i <= g; ++i) for (int val = 0; val <= v_max; ++val) dp[i][val] = inf;
dp[0][0] = 0;
for (int val = 1; val <= v_max; ++val) { //gap = val
//if (nr[val] == 0) continue;
for (int r = 0; r < val; ++r) {
deque < int > dq;
for (int i = r; i <= g; i += val) {
if ((int)dq.size() && (i - dq.front()) / val == nr[val] + 1)
dq.pop_front();
while ((int)dq.size() && dp[i][val-1] < get_dp(dq.back(), i, val))
dq.pop_back();
dq.push_back(i);
if ((int)dq.size())
update_ans(i, val, dq.front());
}
}
}
}
void get_ans() {
int i; for (i = g; dp[i][v_max] == inf; --i);
for (int val = v_max; val ; --val) {
for (int j = 1; j <= used[i][val]; ++j)
ans.push_back(val);
i -= used[i][val] * val;
}
}
void solve() {
compute_dp();
get_ans();
}
void output() {
int i; for (i = g; dp[i][v_max] == inf; --i);
printf("%d %d\n", i, dp[i][v_max]);
for (auto &it : ans) printf("%d\n", it);
}
int main()
{
freopen("ghiozdan.in","r",stdin);
freopen("ghiozdan.out","w",stdout);
input();
solve();
output();
return 0;
}