Cod sursa(job #2097867)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 1 ianuarie 2018 19:25:30
Problema Peste Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int MAXN = (int) 5e4;
const int MAXT = (int) 1e3;

pair <int, int> v[MAXN + 1];

ll best[MAXT + 1];
int fr[MAXT + 1];

ll dp[MAXN + 1];

int main() {
    ifstream cin("peste.in");
    ofstream cout("peste.out");
    int i, n, k, total, j;
    ios::sync_with_stdio(false);
    cin >> n >> k >> total;
    for(i = 1; i <= n; i++) {
        cin >> v[i].second >> v[i].first;
    }
    sort(v + 1, v + n + 1);
    int p = 1;
    for(i = 1; i <= MAXT; i++) {
        while(p <= n && v[p].first <= i) {
            fr[v[p].second]++;
            p++;
        }
        int cnt, sz;
        ll sum;
        sz = min(p - 1, k);
        cnt = sum = 0;
        for(j = MAXT; cnt < sz; j--) {
            if(cnt + fr[j] <= sz) {
                cnt += fr[j];
                sum += j * fr[j];
            }
            else {
                sum += (sz - cnt) * j;
                cnt = sz;
            }
        }
        best[i] = sum;
    }
    for(i = 1; i <= total; i++) {
        for(j = 1; j <= min(i, MAXT); j++) {
            dp[i] = max(dp[i], dp[i - j] + best[j]);
        }
    }
    cout << dp[total];
    cin.close();
    cout.close();
    return 0;
}