Pagini recente » Cod sursa (job #1486221) | Cod sursa (job #2096050) | Cod sursa (job #2500727) | Cod sursa (job #2556567) | Cod sursa (job #513472)
Cod sursa(job #513472)
#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[maxg], dp[2][maxg];
void dynamic(int x, int y, int G, int *dp) {
for (int i = 1; i <= G; ++i)
dp[i] = inf;
dp[0] = 0;
for (int i = x; i < y; ++i)
if (v[i] > 0)
for (int j = 0; j < i; ++j) {
int p = 1, q = 0;
deque[++q] = j;
for (int k = i + j; k <= G; k += i) {
while (p <= q && deque[p] < k - v[i] * i && p <= q)
++p;
if (p <= q)
aux[k] = dp[deque[p]] + (k - deque[p]) / i;
else
aux[k] = inf;
while (q >= p && dp[deque[q]] + (k - deque[q]) / i >= dp[k])
--q;
deque[++q] = k;
}
for (int k = i +j; k <= G; k += i)
if (dp[k] > aux[k])
dp[k] = aux[k];
}
}
void solve(int x, int y, int G, int answer) {
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;
dynamic(x, mid, G, dp[0]);
dynamic(mid, y, G, dp[1]);
for (int i = 0; i <= G; ++i)
if (dp[0][i] + dp[1][G - i] == answer) {
int p = dp[0][i], q = dp[1][G - i];
solve(x, mid, i, p);
solve(mid, y, G - i, q);
return;
}
}
int n, G, i, x;
int main() {
f >> n >> G;
for (i = 0; i < n; ++i)
f >> x, ++v[x];
dynamic(1, 201, G, dp[0]);
for (i = G; i >= 0 && dp[0][i] == inf; --i);
g << i << " " << dp[0][i] << "\n";
solve(1, 201, i, dp[0][i]);
}