Cod sursa(job #1413005)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 1 aprilie 2015 18:01:38
Problema Peste Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <cstdio>
#include <queue>

#define Vmax 1010
#define Nmax 50010

using namespace std;

int N , k , Ttotal , i , j , tt, sum;
int p[Nmax] , t[Nmax] , S[Nmax] , T[Vmax];

priority_queue < int > aux[Vmax];

int main()
{
    freopen("peste.in","r",stdin);
    freopen("peste.out","w",stdout);

    scanf("%d %d %d", &N, &k, &Ttotal);

    for (i = 1; i <= N; ++i)
    {
        scanf("%d %d", &p[i], &t[i]); p[i] *= (-1);

        tt = t[i];

        if (aux[tt].size() == k && aux[tt].top() > p[i])
        {
            aux[tt].pop();
            aux[tt].push(p[i]);
        }
        else if (aux[tt].size() < k) aux[tt].push(p[i]);
    }

    for (i = 1; i <= N; ++i)
    {
        for (tt = t[i] + 1; tt <= 1000; ++tt)
        if (aux[tt].size())
        {
            if (aux[tt].size() == k && aux[tt].top() > p[i])
            {
                aux[tt].pop();
                aux[tt].push(p[i]);
            }
            else if (aux[tt].size() < k) aux[tt].push(p[i]);
        }
    }

    for (i = 1; i <= 1000; ++i)
    {
        for (sum = 0, j = 1; j <= k && aux[i].size(); ++j)
        {
            sum += aux[i].top();
            aux[i].pop();
        }

        (j == k + 1) ? T[i] = sum * (-1) : T[i] = 0;
    }

    for (i = 1; i <= min(1000 , Ttotal); ++i)
     if (T[i])
     {
         for (j = i; j <= Ttotal; ++j)
          S[j] = max(S[j] , S[j-i] + T[i]);
     }

    printf("%d\n", S[Ttotal]);


    return 0;
}