제출 #1339399

#제출 시각아이디문제언어결과실행 시간메모리
1339399uranhishigWatching (JOI13_watching)C++20
50 / 100
450 ms31860 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long  

int n, p, q;
vector<int> a;
const int maxn = 2005;

int l1[maxn];
int l2[maxn];
int dp[maxn][maxn];

bool ok(int x) {
    for (int i = 0; i < n; i++) {
        l1[i] = upper_bound(a.begin(), a.end(), a[i] - x) - a.begin();
        l2[i] = upper_bound(a.begin(), a.end(), a[i] - 2 * x) - a.begin();
    }
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= p; j++) {
            dp[i][j] = 1e18;
        }
    }
    dp[0][0] = 0;
    for (int i = 1; i <= n; i++) {
        dp[i][0] = dp[l2[i - 1]][0] + 1;
        for (int j = 1; j <= p; j++) {
            dp[i][j] = min({dp[i][j - 1], dp[l1[i - 1]][j - 1], dp[l2[i - 1]][j] + 1});
        }
    }
    return dp[n][p] <= q;
}

signed main(){
    cin >> n >> p >> q;
    a.resize(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    sort(a.begin(), a.end());
    int l = 0, r = 1e10;
    while (l + 1 < r) {
        int mid = (l + r)/2;
        if(ok(mid)) {
            r = mid;
        }
        else {
            l = mid;
        }
    }
    cout << r;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...