Cod sursa(job #35397)
Utilizator | 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;
}