Submission #1251858

#TimeUsernameProblemLanguageResultExecution timeMemory
1251858mardaWatching (JOI13_watching)C++20
100 / 100
571 ms31992 KiB
#include <iostream> #include <algorithm> #include <string> #include <map> #include <set> #include <vector> #include <tuple> #define endl "\n" #define int long long int #define ld long double #define mp make_pair #define pb push_back #define Bound 1e9 + 5 using namespace std; int n, p, q; vector<int> arr; bool cam(int mid) { vector<vector<int>> dp(n + 5, vector<int>(n + 5, Bound)); for (int i = 0; i <= n; i++) dp[0][i] = 0; for (int i = 1; i <= n; i++) { int id1 = lower_bound(arr.begin(), arr.end(), arr[i - 1] - mid + 1) - arr.begin(); int id2 = lower_bound(arr.begin(), arr.end(), arr[i - 1] - 2 * mid + 1) - arr.begin(); for (int j = 0; j <= n; j++) { if (j != 0) dp[i][j] = min(dp[i][j], dp[id1][j - 1]); dp[i][j] = min(dp[i][j], dp[id2][j] + 1); } } bool doit = false; for (int i = 0; i <= n; i++) { if (i <= p && dp[n][i] <= q) doit = true; } return doit; } int32_t main() { cin >> n >> p >> q; for (int i = 1; i <= n; i++) { int a; cin >> a; arr.pb(a); } sort(arr.begin(), arr.end()); int l = 1, r = Bound, w = 1; while (l <= r) { int mid = (l + r) / 2; if (cam(mid)) r = mid - 1, w = mid; else l = mid + 1; } cout << w << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...