Cod sursa(job #1541238)

Utilizator TopiAlexTopala Alexandru TopiAlex Data 3 decembrie 2015 21:01:54
Problema Ghiozdan Scor 42
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <stdio.h>
#include <queue>
#define N_MAX 20002
#define G_MAX 75002

FILE *in, *out;

struct Element{
    int val;
    //std::queue<int> lista;

//    std::queue<int> operator=(const Element & e){
//        this->lista = e.lista;
//        return this->lista;
//    }
};

int n;
int g;
int gr[N_MAX];
Element v[G_MAX]; //v[i] = nr minim de obiecte pt a obt greutatea i

void citire();

int main()
{
    citire();
    int st, dr, auxDr, auxSt;
    int i, j;

    dr = g;
    st = 1;
    auxDr = gr[1];
    auxSt = gr[1];

    for (i = 1; i <= n; ++i){
        for (j = dr; j >= st; --j){
            if ((j + gr[i] <= g) && ((v[j].val != 0) && ((v[j + gr[i]].val > v[j].val + 1) || (v[j + gr[i]].val == 0)))){
                v[j + gr[i]].val = v[j].val + 1;
                //v[j + gr[i]] = v[j];
                //v[j + gr[i]].lista.push(gr[i]);

                if (j + gr[i] > auxDr)
                    auxDr = j + gr[i];
                if (j + gr[i] < auxSt)
                    auxSt = j + gr[i];
            }
        }
        v[gr[i]].val = 1;
        //v[gr[i]].lista.push(gr[i]);

        if (gr[i] > auxDr)
            auxDr = gr[i];
        if (gr[i] < auxSt)
            auxSt = gr[i];

        dr = auxDr;
        st = auxSt;
    }

    i = g;

    while (v[i].val == 0){
        i--;
    }

    fprintf(out, "%d %d\n", i, v[i].val);
    /*
    while (!v[i].lista.empty()){
        fprintf(out, "%d\n", v[i].lista.front());
        v[i].lista.pop();
    }
    */

    /*
    for (j = v[i].val; j > 0; --j){
        fprintf(out, "%d\n", v[i].prev);
        i = i - v[i].prev;
    }
    */
    fclose(in);
    fclose(out);

    return 0;
}

void citire(){
    in = fopen("ghiozdan.in", "r");
    out = fopen("ghiozdan.out", "w");

    fscanf(in, "%d%d", &n, &g);

    for (int i = 1; i <= n; ++i)
        fscanf(in, "%d", &gr[i]);
}