Cod sursa(job #3262533)

Utilizator pofianFilipp pofian Data 10 decembrie 2024 16:45:14
Problema Ghiozdan Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <stdio.h>
#include <algorithm>
#include <map>

#define MAX(a, b) (a > b ? a : b)
#define MIN(a, b) (a < b ? a : b)

int vs[75000 + 5];
int wh[20000 + 5];

FILE *out;

bool bigger(int a, int b)
{
    return a > b;
}

// int v[75000 + 5];
std::map<int, int, decltype(&bigger)> v(bigger);

void createsol(int sol);
bool condition(int a, int b, int s)
{
    if (v[a] + v[b] != v[s]) 
        return 0;

    createsol(b);
    createsol(a);
    return 1;
}

void createsol(int g)
{
    if (g <= 0)
        return;

    if (v[g] == 1) {
        fprintf(out, "%d\n", g);
        return;
    }

    int a = vs[g];
    if (a > 0 && condition(a, g - a, g))
        return;

    for (int a = 1; a < g; a++)
        if (v.find(a) != v.end()) {
            int b = g - a;
            if (v.find(b) != v.end() && condition(a, b, g))
                return;
        }
}

int main()
{
    FILE *in = fopen("ghiozdan.in", "r");

    int n, g;
    fscanf(in, "%d%d", &n, &g);
    for (int i = 0; i < n; i++)
        fscanf(in, "%d", &wh[i]);
    std::sort(wh, wh + n, bigger);

    v[0] = 0;
    for (int i = 0; i < n; i++) {
        for (const auto& pair : v) {
            int s = wh[i] + pair.first;
            if (s <= g && (v.find(s) == v.end() || v[s] > 1 + pair.second)) {
                v[s] = 1 + pair.second;
                vs[s] = pair.first;
            }
        }
    }
    fclose(in);

    out = fopen("ghiozdan.out", "w");
    g = v.begin()->first;
    fprintf(out, "%d %d\n", g, v[g]);
    createsol(g);
    // for (const auto& pair : v)
    //     fprintf(out, "%d ", pair.first);
    fclose(out);
}