Pagini recente » Profil warangel | Istoria paginii preoji-2004/clasament-9-10 | Cod sursa (job #2913255) | Cod sursa (job #3280470) | Cod sursa (job #3262368)
#include <stdio.h>
#include <algorithm>
#define MAX(a, b) (a > b ? a : b)
#define MIN(a, b) (a < b ? a : b)
int v[75000 + 5];
int vs[75000 + 5];
int wh[20000 + 5];
FILE *out;
void createsol(int sol);
bool condition(int a, int b, int s)
{
if (v[a] + v[b] == v[s]) {
createsol(a);
createsol(b);
return 1;
}
return 0;
}
void createsol(int sol)
{
if (sol <= 0)
return;
if (v[sol] == 1) {
fprintf(out, "%d\n", sol);
return;
}
int a = vs[sol];
int b = sol - a;
if (condition(a, b, sol))
return;
for (int a = 1; a < sol; a++)
if (v[a] != 0) {
int b = sol - a;
if (v[b] != 0 && condition(a, b, sol))
return;
}
}
int main()
{
FILE *in = fopen("ghiozdan.in", "r");
int n, g;
fscanf(in, "%d%d", &n, &g);
int max = 0;
for (int i = 0; i < n; i++) {
fscanf(in, "%d", &wh[i]);
}
std::sort(wh, wh + n, [](int a, int b) {return a > b;});
for (int i = 0; i < n; i++) {
// fscanf(in, "%d", &wh[i]);
// printf("\nwh=%d\n", wh[i]);
for (int j = max; j >= 0; j--)
if (v[j] != 0) {
int s = wh[i] + j;
if (s <= g) {
if (v[s] == 0) {
v[s] = 1 + v[j];
vs[s] = j;
} else if (v[s] > 1 + v[j]) {
v[s] = 1 + v[j];
vs[s] = j;
}
// printf("Updated [%d] -> %d\n", s, v[s]);
max = MAX(max, s);
}
}
// printf("Updated [%d] -> %d\n", wh[i], 1);
v[wh[i]] = 1;
vs[wh[i]] = wh[i];
max = MAX(max, wh[i]);
}
fclose(in);
int sol = g;
while(sol >= 0 && v[sol] == 0)
sol--;
out = fopen("ghiozdan.out", "w");
fprintf(out, "%d %d\n", sol, v[sol]);
createsol(sol);
fclose(out);
}