제출 #1327892

#제출 시각아이디문제언어결과실행 시간메모리
1327892noobsolver24Watching (JOI13_watching)C++20
100 / 100
182 ms31876 KiB
#include <bits/stdc++.h>
// #ifndef ONLINE_JUDGE
// #include "algo/debug.h"
// #endif
using namespace std;
#define int long long 
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()

const int sz = 2e3 + 5, inf = 1e18, mod = 998244353;

int a[sz], dp[sz][sz];

void _(){
    int n, p, q;
    cin >> n >> p >> q;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    sort(a + 1, a + n + 1);
    p = min(p, n);
    q = min(q, n);
    int l = 1, r = (int)1e9, best = r;
    while (l <= r) {
        int mid = (l + r) >> 1;
        vector<int> nxts(n + 1), nxtl(n + 1);
        for (int i = 1; i <= n; i++) {
            nxts[i] = upper_bound(a + 1, a + n + 1, a[i] + mid - 1) - a - 1;
            nxtl[i] = upper_bound(a + 1, a + n + 1, a[i] + 2 * mid - 1) - a - 1;
        }
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= q; j++) {
                dp[i][j] = inf;
            }
        }
        dp[0][0] = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= q; j++) {
                if (dp[i][j] > p) continue;
                int next = nxts[i + 1];
                dp[next][j] = min(dp[next][j], dp[i][j] + 1);
                if (j + 1 <= q) {
                    next = nxtl[i + 1];
                    dp[next][j + 1] = min(dp[next][j + 1], dp[i][j]);
                }
            }
        }
        bool ok = 0;
        for (int j = 0; j <= q; j++) {
            if (dp[n][j] <= p) {
                ok = 1;
                break;
            }
        }
        if (ok) {
            best = mid;
            r = mid - 1;
        } else l = mid + 1;
    }
    cout << best << endl;
}

signed main(){
    cin.tie(nullptr)->sync_with_stdio(0);
    int T = 1;
    // cin >> T;
    while (T--) _();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...