이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <cmath>
using namespace std;
using ll = long long;
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) < (b)) ? (b) : (a))
int const nmax = 2000;
int const inf = 1000000000;
int v[1 + nmax];
int n, p, q;
int dp[1 + nmax][1 + nmax];
int test(int target){
for(int i = 0; i <= n; i++)
for(int j = 0; j <= p; j++)
dp[i][j] = n + 1;
dp[0][0] = 0;
for(int i = 1;i <= n; i++) {
int p1 = i, p2 = i;
while(1 <= p1 && v[i] - v[p1] + 1 <= target)
p1--;
while(1 <= p2 && v[i] - v[p2] + 1 <= 2 * target)
p2--;
for(int j = 1; j <= p; j++)
dp[i][j] = min(dp[i][j], dp[p1][j - 1]);
for(int j = 0; j <= p; j++)
dp[i][j] = min(dp[i][j], dp[p2][j] + 1);
}
for(int i = 0;i <= p; i++)
if(dp[n][i] <= q)
return 1;
return 0;
}
int binarysearch(int from, int to){
if(from < to){
int mid = (from + to) / 2;
if(test(mid) == 1)
return binarysearch(from, mid);
else
return binarysearch(mid + 1, to);
} else
return from;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> p >> q;
p = min(n, p);
q = min(n, q);
for(int i = 1; i <= n; i++)
cin >> v[i];
sort(v + 1, v + n + 1);
cout << binarysearch(1, inf);
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |