Pagini recente » Cod sursa (job #1698773) | Cod sursa (job #287881) | Cod sursa (job #880560) | Cod sursa (job #3152312) | Cod sursa (job #427505)
Cod sursa(job #427505)
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
using namespace std;
class Gutuie{
public:
unsigned int greutate, inaltime;
};
unsigned int u;
inline unsigned int nivel( unsigned int a ){
if( a % u == 0 )
return a / u - 1;
else
return a / u;
}
bool operator<(Gutuie a, Gutuie b){
if( nivel(a.inaltime) < nivel(b.inaltime) )
return false;
else{
if( nivel(a.inaltime) == nivel(b.inaltime)) {
if( a.greutate < b.greutate )
return false;
else
return true;
}
else
return true;
}
}
int main(){
unsigned int n, hmax;
FILE * fin = fopen( "gutui.in", "r" );
FILE * fout = fopen( "gutui.out", "w" );
fscanf( fin, "%u %u %u", &n, &hmax, &u );
unsigned int i, j;
vector<Gutuie> v(n);
for(i = 0; i < n; i++)
fscanf(fin, "%u %u", &v[i].inaltime, &v[i].greutate);
sort( v.begin(), v.end() );
/*for(i = 0; i < n; i++)
printf("%d %d\n", v[i].inaltime, v[i].greutate);*/
vector<int> best(n);
vector<int> nrg(n);
best[0] = v[0].greutate; nrg[0] = 1;
for(i = 1; i < n; i++){
best[i] = v[i].greutate;
nrg[i] = 1;
for(j = 0; j < i; j++)
if( best[j] + v[i].greutate >= best[i] && nrg[j] * u + v[i].inaltime <= hmax ){
best[i] = best[j] + v[i].greutate;
nrg[i] = nrg[j] + 1;
}
}
/*for(i = 0; i < n; i++)
printf("%d ", best[i]);
printf("\n");
for(i = 0; i < n; i++)
printf("%d ", nrg[i]);
printf("\n");*/
unsigned int max = 0;
for(i = 0; i < n; i++)
if( max < best[i] )
max = best[i];
fprintf(fout, "%u\n", max);
fclose(fout);
fclose(fin);
return 0;
}