Cod sursa(job #18273)

Utilizator cos_minBondane Cosmin cos_min Data 18 februarie 2007 11:10:41
Problema Ghiozdan Scor 30
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 2.22 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 a[2][dim], nr[2][dim];
int v[dim2];
int G, N;
int Gmax=0, Nmin=0;
int t[2][dim];

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;
    // pt Gmax;
    
    for ( int i = 2; i <= N; i++ )
    {
        a[1][v[i]] = 1;
        if ( v[i] > G ) continue;
        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;
                 }
            }
        }
        
        for ( int j = 0; j <= G; j++ )
        {
            if ( a[0][j] == 0 && a[1][j] == 1 ) 
            {
                 a[0][j] = 1;
            }
            
            if ( a[0][j] == 1 )
            {
               if ( j > Gmax ) Gmax = j;
            }
        }
    }
    
    // pt Nmin;
    
    nr[0][v[1]] = 1;
    t[0][v[1]] = 1;
    
    for ( int i = 2; i <= N; i++ )
    {
        nr[1][v[i]] = 1;
        t[1][v[i]] = i;
        if ( v[i] > Gmax ) continue;
        for ( int j = 0; j <= Gmax-v[i]; j++ )
        {
            if ( nr[0][j] != 0 )
            {
                 if ( nr[1][j+v[i]] > nr[0][j] + 1 || nr[1][j+v[i]] == 0 )
                 {
                      nr[1][j+v[i]] = nr[0][j] + 1;
                      t[1][j+v[i]] = i;
                 }
            }
        }
        
        for ( int j = 0; j <= Gmax; j++ )
        {
            if ( nr[0][j] == 0 || nr[0][j] > nr[1][j] && nr[1][j] != 0 ) nr[0][j] = nr[1][j], t[0][j] == t[1][j];
        }
    }
    
 /*   for ( int i = 0; i <= 1; i++ )
    {
        for ( int j = 1; j <= Gmax; j++ )
        {
            printf(" | %d %d %d | ", j, a[i][j], t[i][j] );
        }
        printf("\n");
    }*/
    
    printf( "%d %d\n", Gmax, nr[0][Gmax] );
 /*   
    int val = Gmax;
    int i = t[1][Gmax];
    int ok = 1;
    */
}