Cod sursa(job #427505)

Utilizator sdnxptVasiliu Radu sdnxpt Data 27 martie 2010 22:05:39
Problema Gutui Scor 10
Compilator cpp Status done
Runda teme_upb Marime 1.8 kb
#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;
}