제출 #1319939

#제출 시각아이디문제언어결과실행 시간메모리
1319939aaaaaaaa구경하기 (JOI13_watching)C++20
0 / 100
1098 ms327680 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int mxN = 2005; const int inf = 2e18 + 4; int a[mxN], n, s, b, cur; int find(int i, int x){ int st = i + 1, en = n - 1, ans = n; while(st <= en){ int mid = st + (en - st) / 2; if((a[mid] - a[i] + 1) > x){ en = mid - 1; ans = mid; }else{ st = mid + 1; } } return ans; } /*vector<vector<int>> dp; int f(int i, int s){ if(s < 0) return inf; if(i == n) return 0; if(dp[i][s] != -1) return dp[i][s]; return dp[i][s] = min(f(find(i, 2 * cur), s) + 1, f(find(i, cur), s - 1)); }*/ int f(int x){ vector<vector<int>> dp(n + 5, vector<int>(s + 5, inf)); for(int j = 0; j <= s; ++j) dp[n][j] = 0; for(int i = n - 1; i >= 0; --i){ int u = find(i, x), v = find(i, 2 * x); for(int j = 0; j <= s; ++j){ dp[i][j] = min((j ? dp[u][j - 1] : inf), dp[v][j] + 1); } } return dp[0][s]; } signed main(){ ios::sync_with_stdio(0); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> s >> b; for(int i = 0; i < n; ++i){ cin >> a[i]; } sort(a, a + n); int st = 1, en = 1e9 + 1, ans = 0; while(st <= en){ int mid = st + (en - st) / 2; if(f(mid) <= b) ans = mid, en = mid - 1; else st = mid + 1; } cout << ans << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...