Pagini recente » Cod sursa (job #2010763) | Cod sursa (job #1687957) | Cod sursa (job #1683460) | Cod sursa (job #1689097) | Cod sursa (job #434769)
Cod sursa(job #434769)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
long int N ;
int H , U;
typedef struct gutui
{
int h;
int g;
int nivel;
int luata;
} GUTUI;
GUTUI *G;
void citire()
{
FILE *f = fopen ( "gutui.in" , "r" ) ;
fscanf( f , "%ld%d%d", &N , &H , &U) ;
G = ( GUTUI * ) malloc ( N * sizeof ( GUTUI ) ) ;
int i;
for ( i = 0 ; i < N ; i++ )
{
fscanf ( f , "%d%d" , &G[i].h , &G[i].g );
G[i].nivel = H / U - G[i].h / U;
}
fclose ( f );
}
int verifica()
{
int i;
for ( i = 0 ; i < N ; i++ )
if ( G[i].nivel != 0 ) return 1;
return 0;
}
void rezolva()
{
FILE *f = fopen ( "gutui.out" , "w" ) ;
int suma = 0;
int i , j , aux;
for ( i = 0 ; i < N ; i++)
for ( j = 0 ; j < N ; j++ )
{
if ( G[i].nivel < G[j].nivel )
{
aux = G[i].nivel;
G[i].nivel = G[j].nivel;
G[j].nivel = aux;
aux = G[i].h;
G[i].h = G[j].h;
G[j].h = aux;
aux = G[i].g;
G[i].g = G[j].g;
G[j].g = aux;
}
if ( G[i].nivel == G[j].nivel && G[i].g > G[j].g )
{
aux = G[i].nivel;
G[i].nivel = G[j].nivel;
G[j].nivel = aux;
aux = G[i].h;
G[i].h = G[j].h;
G[j].h = aux;
aux = G[i].g;
G[i].g = G[j].g;
G[j].g = aux;
}
}
int max = 0 , niv , fl = 0, ind;
while ( verifica ( ) )
{
i = 0;
while ( G[i].nivel <= 0 )
i++;
j = i;
niv = G[i].nivel - 1;
while ( G[j].nivel == niv )
{
if ( G[j].g > G[i].g )
{
max ++;
if ( G[j].g > fl)
{
fl = G[j].g;
ind = j;
}
}
}
if ( max < 2 )
suma = suma + G[i].g;
else
{
suma = suma + G[ind].g;
G[ind].nivel = 0;
}
for ( i = 0 ; i < N ; i++)
if ( G[i].nivel != 0 )
G[i].nivel --;
}
fprintf ( f , "%d\n" , suma );
fclose(f);
}
int main()
{
citire();
rezolva();
return 0;
}