Cod sursa(job #1248704)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 25 octombrie 2014 20:49:26
Problema Ghiozdan Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<cstdio>
#include<cstdlib>
#include<cassert>

FILE *fi,*fo;

const int MAX_N = 20004;
const int MAX_G = 75004;

int greutate[MAX_N];
bool este[MAX_G];
int last[MAX_G];
int nr[MAX_G];
int nr_ob[205];
int sol,x,G;
int i,j,k,N;

int main(){
    assert( (fi=fopen("ghiozdan.in","r")) != NULL );
    assert( (fo=fopen("ghiozdan.out","w")) != NULL );
    
    assert( fscanf(fi,"%d%d\n", &N, &G) == 2 );
    for(i=1;i<=N;i++){ 
                      assert( fscanf(fi,"%d", &x) == 1); 
                      nr_ob[x]++; 
                     }
    
    este[0]=1;
    last[0]=0;
    nr[0]=0;
    for(j=1;j<=G;j++) nr[j]=N+5;
    
    for(i=1;i<=200;i++)
     if(nr_ob[i]>0)
       for(k=1;k<=nr_ob[i];k++)
         for(j=G;j>=i;j--)
           if(este[j-i] && (nr[j-i]+1<nr[j]))
           {
            este[j]=1;
            last[j]=i;
            nr[j]=nr[j-i]+1;
            if(j>sol) sol=j;
           }
             
    assert( fprintf(fo,"%d %d\n", sol, nr[sol]) > 0 );
    
    for(j=sol;j>=0;--j)
      if(nr[j]+1==nr[sol] && nr_ob[sol-j])
        {
         --nr_ob[sol-j];
         assert( fprintf(fo,"%d\n", sol-j) > 0 );
         sol=j;
        } 
    
    assert( fclose(fi) != EOF );
    assert( fclose(fo) != EOF );
    return 0;
}