Cod sursa(job #1712377)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 2 iunie 2016 19:24:29
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#define INF 1000000000
#define MAXG 75000
#define MAXA 200
FILE *fout;
int last[MAXG+1], fr[MAXA+1];
bool acum[MAXG+1];
void baga(int x, int s){
    if(x==0) fprintf(fout, "%d\n", s);
    else{
        baga(x-last[x], s+1);
        fprintf(fout, "%d\n", last[x]);
    }
}
int main(){
    int n, g, i, x, j, r, a, max;
    FILE *fin;
    fin=fopen("ghiozdan.in", "r");
    fout=fopen("ghiozdan.out", "w");
    fscanf(fin, "%d%d", &n, &g);
    for(i=0; i<n; i++){
        fscanf(fin, "%d", &x);
        fr[x]++;
    }
    last[0]=-1;
    for(i=MAXA; i>0; i--){
        for(r=0; r<i; r++){
            a=-INF;
            for(j=r+i; j<=g; j+=i){
                if(last[j-i]){
                    a=j-i;
                }
                if(j-a<=i*fr[i]){
                    acum[j]=1;
                }else{
                    acum[j]=0;
                }
            }
        }
        for(j=1; j<=g; j++){
            if((!last[j])&&(acum[j])) last[j]=i;
        }
    }
    max=0;
    for(i=1; i<=g; i++){
        if(last[i]) max=i;
    }
    fprintf(fout, "%d ", max);
    baga(max, 0);
    fclose(fin);
    fclose(fout);
    return 0;
}