Cod sursa(job #18119)

Utilizator cos_minBondane Cosmin cos_min Data 18 februarie 2007 09:40:46
Problema Ghiozdan Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 2.03 kb
#include <stdio.h>
#include <fstream>
using namespace std;

#define in "ghiozdan.in"
#define out "ghiozdan.out"
#define dim 75001
#define infinit 100001
#define dim2 20001

int t[dim], a[2][dim], nr[dim];
int v[dim2];
int G, N;
int Gmax=0, Nmin=0;

int main()
{
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf( "%d%d", &N, &G );
    for ( int i = 1; i <= N; i++ )
    {
        scanf( "%d", &v[i] );
    }
    
    a[0][v[1]] = 1;
    nr[v[1]] = 1;
    
    for ( int i = 1; i <= N; i++ )
    {
        a[1][v[i]] = 1;
        nr[v[i]] = 1;
        
        if ( Gmax < v[i] ) 
        {
             Gmax = v[i];
             Nmin = nr[v[i]];
        }
        else if ( Gmax == v[i] && Nmin > 1 ) Nmin = 1;

        for ( int j = 0; j <= G-v[i]; j++ )
        {
            if ( a[0][j] == 1 )
            {
                 if ( a[1][j+v[i]] == 0 )
                 {
                      a[1][j+v[i]] = 1;
                      nr[j+v[i]] = nr[j] + 1;
                      
                      if ( Gmax < j+v[i] ) 
                      {
                           Gmax = j+v[i];
                           Nmin = nr[j+v[i]];
                      }
                      else if ( Gmax == j + v[i] && Nmin > nr[j+v[i]] ) Nmin = nr[j+v[i]];
                 }
                 else
                 {
                     if ( a[1][j+v[i]] == 1 && nr[j+v[i]] > nr[j] + 1 )
                     {
                          nr[j+v[i]] = nr[j] + 1;
                          if ( Gmax < j+v[i] ) 
                          {
                             Gmax = j+v[i];
                             Nmin = nr[j+v[i]];
                          }
                          else if ( Gmax == j + v[i] && Nmin > nr[j+v[i]] ) Nmin = nr[j+v[i]];
                     }
                 }
            }
        }
        
        for ( int j = 0; j <= G; j++ )
            if ( a[0][j] == 0 && a[1][j] == 1 ) a[0][j] = 1;
    }
    
    printf( "%d %d\n", Gmax, Nmin+1 );
}