Mai intai trebuie sa te autentifici.
Cod sursa(job #1853463)
Utilizator | Data | 21 ianuarie 2017 20:05:21 | |
---|---|---|---|
Problema | Energii | Scor | 100 |
Compilator | c | Status | done |
Runda | Arhiva de probleme | Marime | 1.16 kb |
#include <stdio.h>
#define nmax 5000
#define infinit 2000000000
int d[nmax]; ///d[i] vector de costuri, unde i e o putere
int maxi( int a, int b ){
return ( a>=b ) ? a : b;
}
int mini( int a, int b ){
return ( a<b ) ? a : b;
}
int main()
{
int n, pmin, p, cost, i, j, costmin, last;
FILE *fin, *fout;
fin = fopen( "energii.in", "r" );
fscanf( fin, "%d%d", &n, &pmin );
costmin = infinit;
last = 0;
for( i=1; i<pmin; i++ )
d[i] = infinit;
for( i=0; i<n; i++ ){
fscanf( fin, "%d%d", &p, &cost );
for( j=last; j>=0; j-- ){
if( j+p >= pmin ) ///daca am depasit puterea minim, calculam cosul minim
costmin = mini( costmin, d[j] + cost );
else{
d[j+p] = mini( d[j+p], d[j] + cost ); ///daca noua putere produce un cost mai mic
last = maxi( last, j+p ); ///ultima pozitie actualizata
}
}
}
fclose( fin );
fout = fopen( "energii.out", "w" );
( costmin < infinit ) ? fprintf( fout, "%d\n", costmin ) : fprintf( fout, "-1\n" );
fclose( fout );
return 0;
}