제출 #304228

#제출 시각아이디문제언어결과실행 시간메모리
304228shrek12357구경하기 (JOI13_watching)C++14
100 / 100
174 ms16128 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <climits>
#include <cmath>
#include <fstream>
#include <queue>
using namespace std;

const int MAXN = 2005;

int n, a, b;
vector<int> nums;	
int dp[MAXN][MAXN];

int idx(int val) {
	int ans = -1;
	int lo = 0, hi = n - 1;
	while (lo <= hi) {
		int mid = (lo + hi) / 2;
		if (nums[mid] < val) {
			lo = mid + 1;
			ans = max(ans, mid);
		}
		else {
			hi = mid - 1;
		}
	}
	return ans;
}

bool check(int mid) {
	int calc1[MAXN], calc2[MAXN];
	for (int i = 0; i < n; i++) {
		calc1[i] = idx(nums[i] - mid + 1);
		calc2[i] = idx(nums[i] - 2 * mid + 1);
	}
	for (int i = 0; i < n; i++) {
		int cur = idx(nums[i] - 2 * mid + 1);
		if (cur == -1) {
			dp[i][0] = 1;
		}
		else {
			dp[i][0] = dp[cur][0] + 1;
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 1; j <= min(a, n); j++) {
			int val1 = calc1[i];
			int val2 = calc2[i];
			int c1 = INT_MAX, c2 = INT_MAX;
			if (val1 == -1) {
				c1 = 0;
			}
			else {
				c1 = dp[val1][j - 1];
			}
			if (val2 == -1) {
				c2 = 1;
			}
			else {
				c2 = dp[val2][j] + 1;
			}
			dp[i][j] = min(c1, c2);
		}
	}
	for (int i = 0; i <= min(a, n); i++) {
		if (dp[n - 1][i] <= b) {
			return true;
		}
	}
	return false;
}

int main() {
	cin >> n >> a >> b;
	for (int i = 0; i < n; i++) {
		int temp;
		cin >> temp;
		nums.push_back(temp);
	}
	sort(nums.begin(), nums.end());
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			dp[i][j] = (int)1e9;
		}
	}
	int lo = 1;
	int hi = (int)1e9;
	int ans = INT_MAX;
	while (lo <= hi) {
		int mid = (lo + hi) / 2;
		if (check(mid)) {
			ans = min(ans, mid);
			hi = mid - 1;
		}
		else {
			lo = mid + 1;
		}
	}
	cout << ans << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...