#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = (ll)1e18;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int a, b, c;
cin >> a >> b >> c;
vector<ll> z(a+1);
for(int i = 1; i <= a; i++){
cin >> z[i];
}
if ((ll)b + c >= a){
cout << 1 << "\n";
return 0;
}
sort(z.begin()+1, z.end());
vector<vector<int>> dp(a+1, vector<int>(b+1, INT_MAX));
auto check = [&](ll w){
for(int i = 0; i <= a; i++)
for(int j = 0; j <= b; j++)
dp[i][j] = INT_MAX;
dp[0][0] = 0;
for(int i = 1; i <= a; i++){
int l = lower_bound(z.begin()+1, z.begin()+i+1, z[i] - w+1) - z.begin();
int k = lower_bound(z.begin()+1, z.begin()+i+1, z[i] - 2*w+1) - z.begin();
for(int j = 0; j <= b; j++){
if (j > 0 && dp[l-1][j-1] != INT_MAX){
dp[i][j] = min(dp[i][j], dp[l-1][j-1]);
}
if (dp[k-1][j] != INT_MAX){
dp[i][j] = min(dp[i][j], dp[k-1][j] + 1);
}
}
}
for(int j = 0; j <= b; j++){
if (dp[a][j] <= c) return true;
}
return false;
};
ll lo = 0, hi = (ll)1e9, ans = hi;
while(lo <= hi){
ll mid = lo + (hi - lo)/2;
if (check(mid)){
ans = mid;
hi = mid - 1;
} else {
lo = mid + 1;
}
}
cout << ans << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |