Submission #503114

#TimeUsernameProblemLanguageResultExecution timeMemory
503114colossal_pepe구경하기 (JOI13_watching)C++17
50 / 100
1094 ms15404 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; int n, p, q; vector<int> v; int brutus(int w, int i, int p_left, vector<vector<int>> &dp) { if (i >= n) return 0; if (dp[i][p_left] != -1) return dp[i][p_left]; int useq = lower_bound(v.begin(), v.end(), v[i] + (2 * w)) - v.begin(); dp[i][p_left] = brutus(w, useq, p_left, dp) + 1; if (p_left) { int usep = lower_bound(v.begin(), v.end(), v[i] + w) - v.begin(); dp[i][p_left] = min(dp[i][p_left], brutus(w, usep, p_left - 1, dp)); } return dp[i][p_left]; } void reset(vector<vector<int>> &dp) { for (vector<int> &row : dp) { fill(row.begin(), row.end(), -1); } } int solve() { vector<vector<int>> dp(n, vector<int>(p + 1, -1)); int minw = 1, maxw = 1e9; while (maxw - minw >= 2) { int mid = (maxw + minw) / 2; reset(dp); if (brutus(mid, 0, p, dp) <= q) maxw = mid; else minw = mid + 1; } for (int i = minw; i <= maxw; i++) { reset(dp); if (brutus(i, 0, p, dp) <= q) return i; } return 1e9; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> p >> q; v.resize(n); for (int &i : v) { cin >> i; } if (p + q >= n) { cout << 1 << endl; return 0; } sort(v.begin(), v.end()); cout << solve() << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...