Submission #51545

#TimeUsernameProblemLanguageResultExecution timeMemory
51545tranxuanbachWatching (JOI13_watching)C++17
100 / 100
337 ms32252 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long

const int N = 2005;
int n, p, q, ans;
int a[N], cnt[N], max2w[N], maxw[N];
int f[N][N];
 
bool check(int mid){
	int cur1 = 1, cur2 = 1;
	for (int i = 1; i <= n; i++){
		for (; cur1 <= n && a[cur1] - a[i] + 1 <= mid; cur1++);
		maxw[i] = cur1 - 1;
		for (; cur2 <= n && a[cur2] - a[i] + 1 <= 2 * mid; cur2++);
		max2w[i] = cur2 - 1;
	}
	memset(f, -1, sizeof(f));
	f[1][0] = maxw[1];
	f[0][1] = max2w[1];
	if (maxw[1] == n || max2w[1] == n){
	    return true;
	}
	for (int i = 0; i <= p; i++){
		for (int j = 0; j <= q; j++){
			if (f[i][j] != -1){
				if (f[i][j] == n){
				    return true;
				}
				f[i][j + 1] = max(f[i][j + 1], max2w[f[i][j] + 1]);
				f[i + 1][j] = max(f[i + 1][j], maxw[f[i][j] + 1]);
			}
		}
	}
	return false;
}

signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> p >> q;
	a[n + 1] = 1e9;
	for (int i = 1; i <= n; i++){
		cin >> a[i];
	}
	sort(a + 1, a + n + 1);	
	if (p + q >= n){
		cout << 1;
		return 0;
	}	
	int l = 1, r = a[n] - a[1] + 1;
	while (l <= r){
		int mid = (l + r) / 2;
		bool kt = check(mid);
		if (kt){
			ans = mid;
			r = mid - 1;
		}
		else{
		    l = mid + 1;
		}
	}
	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...