Pagini recente » Cod sursa (job #462765) | Cod sursa (job #1408093) | Cod sursa (job #3220409) | Cod sursa (job #938305) | Cod sursa (job #1413005)
#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;
}