Cod sursa(job #1603647)

Utilizator akaprosAna Kapros akapros Data 17 februarie 2016 18:26:53
Problema Peste Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>
#define maxN 50002
#define maxT 1002
#define ll long long
using namespace std;
int n, m, k, t, T;
struct fish
{
    int p, t;
} v[maxN];
long long sum[maxT], dp[maxN];
priority_queue < int > s;
ll Max(ll a, ll b)
{
    if (a > b)
        return a;
    return b;
}
int Min(int a, int b)
{
    if (a < b)
        return a;
    return b;
}
int cmp(const fish a, const fish b)
{
    if (a.t == b.t)
        return a.p < b.p;
    return a.t < b.t;
}
void read()
{
    int i;
    freopen("peste.in", "r", stdin);
    scanf("%d %d %d", &n, &k, &t);
    for (i = 1; i <= n; ++ i)
        scanf("%d %d", &v[i].p, &v[i].t);
}
void get_fish()
{
    int i, j;
    sort(v + 1, v + n + 1, cmp);
    for (i = 1; i <= n; ++ i)
    {
        sum[v[i].t] = sum[v[i - 1].t] + v[i].p;
        s.push(-v[i].p);
        if (i < k)
        {
            sum[v[i].t] += s.top();
            s.pop();
        }
        T = max(T, v[i].t);
    }
}
void go_fish()
{
    int i, j;
    for (i = 1; i <= t; ++ i)
        for (j = 1; j <= Min(i, T); ++ j)
            dp[i] = Max(dp[i], dp[i - j] + sum[j]);
}
void solve()
{
    get_fish();
    go_fish();
}
void write()
{
    freopen("peste.out", "w", stdout);
    printf("%lld\n", dp[t]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}