제출 #1265795

#제출 시각아이디문제언어결과실행 시간메모리
1265795canhnam357구경하기 (JOI13_watching)C++20
100 / 100
242 ms16112 KiB
#include <bits/stdc++.h> using namespace std; #define N 2001 int dp[N][N]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, p, q; cin >> n >> p >> q; vector<int> a(n); for (int &i : a) cin >> i; sort(a.begin(), a.end()); p = min(p, n); q = min(q, n); auto can = [&](int m) { for (int i = 0; i < n; i++) { for (int j = 0; j <= p; j++) { dp[i][j] = q + 1; } } for (int l = 0, r = 0, k = 0; r < n; r++) { while (a[r] - a[l] + 1 > m) l++; while (a[r] - a[k] + 1 > 2 * m) k++; if (l == 0) { dp[r][0] = 1; dp[r][1] = 0; } else { if (k == 0) { dp[r][0] = 1; for (int i = 1; i <= p; i++) { dp[r][i] = min(dp[r][i], dp[l - 1][i - 1]); } } else { for (int i = 1; i <= p; i++) { dp[r][i] = min(dp[r][i], dp[l - 1][i - 1]); } for (int i = 0; i <= p; i++) { if (dp[k - 1][i] < q) dp[r][i] = min(dp[r][i], dp[k - 1][i] + 1); } } } } return *min_element(dp[n - 1], dp[n - 1] + p + 1) <= q; }; int l = 0, r = 1e9 + 1; while (r - l > 1) { int m = (l + r) >> 1; if (can(m)) r = m; else l = m; } cout << r; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...