Cod sursa(job #35397)

Utilizator Bluedrop_demonPandia Gheorghe Bluedrop_demon Data 22 martie 2007 00:28:52
Problema Energii Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.34 kb
// Problema  energii

#include <stdio.h>
#define MAX         1002
#define INF         10002

int C[MAX][2];

void InterC( int st, int m, int dr )
{
     int a[MAX][2], b[MAX][2];
     int i, j, k;
     for( i=st; i<=m; i++ ){ a[i][0] = C[i][0]; a[i][1] = C[i][1]; }
     for( i=m+1; i<=dr; i++ ){ b[i][0] = C[i][0]; b[i][1] = C[i][1]; }
     a[m+1][1] = INF;
     a[dr+1][1] = INF;
     i = st;
     j = m+1;
     for( k=st; k<=dr; k++ )
          if( a[i][1] < b[j][1] )
              {
                  C[k][0] = a[i][0];
                  C[k][1] = a[i][1];
                  i++;
              }
              else
              if( a[i][1] == b[j][1] )
                  {
                          if( a[i][0] > b[i][0] )
                              {
                                      C[k][0] = a[i][0];
                                      C[k][1] = a[i][1];
                                      i++;
                              }
                              else
                              {
                                  C[k][0] = b[j][0];
                                  C[k][1] = b[j][0];
                                  j++;
                              }
                  }
                  else
                  {
                      C[k][0] = b[j][0];
                      C[k][1] = b[j][1];
                      j++;
                  }
}

int MergeS( int st, int dr )
{
     if( st == dr ) return 0;
     int m;
     m = (int)(( st + dr ) /2);
     MergeS( st, m );
     MergeS( m+1, dr );
     InterC( st, m, dr );
     return 0;  
}

int main()
{
    int G, W;
    int S[MAX][2];
    int i, j;
        
    freopen( "energii.in", "rt", stdin );
             scanf( "%d", &G );
             scanf( "%d", &W );
             for( i=1; i<=G; i++ )
                  scanf( "%d %d", &C[i][0], &C[i][1] );
    fclose( stdin );
    MergeS( 1, G );
    int cd;
    S[1][0] = C[1][0];
    S[1][1] = C[1][1];
    for( i=2; i<=G; i++ )
         {
              cd = 0;
              for( j=1; j<i; j++ )
                   if( S[j][0] >= W ) 
                       {
                        if( ( C[i][0] >= W ) && ( C[i][1] < S[j][1] ) )
                           {
                                 S[i][0] = C[i][0];
                                 S[i][1] = C[i][1];
                           }
                           else
                           {
                               S[i][0] = S[j][0];
                               S[i][1] = S[j][1];
                           }
                        cd = 1;
                        break;
                       }
                       if( !cd )
                       if( C[i][0] >= W )
                           {
                                   S[i][0] = C[i][0];
                                   S[i][1] = C[i][1];                                   
                           }
                           else
                           {
                               S[i][0] = C[i][0] + S[i-1][0];
                               S[i][1] = C[i][1] + S[i-1][1];
                           }
         }

    
    freopen( "energii.out", "wt", stdout );
             if( S[G][0] >= W ) printf( "%d\n", S[G][1] );
                 else printf( "0\n" );
    fclose( stdout );
    return 0;
}