Pagini recente » Cod sursa (job #2779070) | Cod sursa (job #1366107) | Cod sursa (job #3210817) | Cod sursa (job #2417738) | Cod sursa (job #2225991)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string.h>
#include <assert.h>
using namespace std;
#define GMAX 75001
#define NMAX 201
#define INF (1 << 30)
int ap[NMAX];
int sol[GMAX], sol_aux[GMAX], diff[GMAX], deq[GMAX];
int main () {
ios::sync_with_stdio(false);
int n, g, i, cnt, j;
ifstream f("ghiozdan.in");
ofstream G("ghiozdan.out");
f >> n >> g;
for (i = 1; i <= n; i++) {
int x;
f >> x;
ap[x]++;
}
f.close();
for (i = 1; i <= g; i++) {
sol[i] = -1;
}
sol[0] = 0;
for (j = 1; j <= NMAX - 1; j++) {
if (ap[j] == 0)
continue;
cnt = ap[j];
memset(sol_aux, 0, sizeof(sol_aux));
for (int off = 0; off <= j - 1; off++) {
{
int k = 0;
for (i = off; i <= g; i += j) {
diff[i] = sol[i] - k;
if (sol[i] == -1)
diff[i] = INF;
k++;
}
}
{
int k = 0, st = 1, dr = 0;
for (i = off; i <= g; i += j) {
while (st <= dr && diff[i] <= diff[deq[dr]])
dr--;
deq[++dr] = i;
int idx = (int)max(0LL, 0LL + i - 1LL * cnt * j);
while (deq[st] < idx)
st++;
if (diff[deq[st]] == INF)
sol_aux[i] = -1;
else
sol_aux[i] = diff[deq[st]] + k;
k++;
}
}
}
for (i = 0; i <= g; i++)
sol[i] = sol_aux[i];
}
for (i = g; i >= 0; i--) {
if (sol[i] != -1)
break;
}
assert(i >= 0);
G << i << " " << sol[i] << '\n';
for (j = 1; j <= sol[i]; j++) {
G << 1 << '\n';
}
G.close();
return 0;
}