Cod sursa(job #3262368)

Utilizator pofianFilipp pofian Data 9 decembrie 2024 21:39:54
Problema Ghiozdan Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#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);
}