Pagini recente » Cod sursa (job #592238) | Cod sursa (job #99286) | Cod sursa (job #1907199) | Cod sursa (job #248233) | Cod sursa (job #513512)
Cod sursa(job #513512)
#include <fstream>
using namespace std;
const char iname[] = "ghiozdan.in";
const char oname[] = "ghiozdan.out";
const int maxg = 75005;
const int maxv = 205;
const int inf = 1000000000;
ifstream f(iname);
ofstream g(oname);
int deque[maxg], v[maxv], aux[2][maxg], dp[2][maxg];
void solve(int x, int y, int G) {
if (G == 0)
return;
if (x == y - 1) {
for (int i = 1; i <= G / x; ++i)
g << x << "\n";
return;
}
int mid = (x + y) / 2;
for (int i = 1; i <= G; ++i)
dp[0][i] = inf;
dp[0][0] = 0;
aux[0][0] = 0;
int type = 0;
for (int i = x; i < y; ++i)
if (v[i] > 0) {
type = 1 - type;
for (int j = 0; j < i; ++j) {
int p = 1, q = 1;
deque[1] = j;
for (int k = j; k <= G; k += i) {
while (p <= q && deque[p] < k - v[i] * i)
++p;
while (p <= q && dp[1 - type][deque[q]] >= dp[1 - type][k] - (k - deque[q]) / i)
--q;
deque[++q] = k;
dp[type][k] = dp[1 - type][deque[p]] + (k - deque[p]) / i;
if (i < mid)
aux[type][k] = k;
else
aux[type][k] = aux [1 - type][deque[p]];
}
}
}
int i, p, q;
for (i = G; i >=0 && dp[type][i] == inf; --i);
if (x == 1 && y == 201)
g << i << " " <<dp[type][i] << "\n";
p = aux[type][i];
q = i - p;
solve(x, mid, p);
solve(mid, y, q);
}
int n, G, i, x;
int main() {
f >> n >> G;
for (i = 0; i < n; ++i)
f >> x, ++v[x];
solve(1, 201, G);
}