답안 #98763

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
98763 2019-02-25T17:00:11 Z figter001 구경하기 (JOI13_watching) C++14
0 / 100
1000 ms 16256 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const ll oo = 1e18;
const int mod = 1e9+7;
const int nax = 2020;

int n,s,b;
int dp[nax][nax];
vector<int> a;

bool can(int w){
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			dp[i][j] = 2e9;
	int  to = -1,u = 0;
	for(int i=0;i<n;i++){
		if(a[i] > to){
			to = a[i] + w - 1;
			u++;
		}
		dp[i][0] = u;
	}
	for(int i=0;i<n;i++){
		for(int j=1;j<=b;j++){
			int cur = a[i] - 2*w + 1;
			if(cur <= 0)dp[i][j] = 0;
			else{
				int at = lower_bound(a.begin(),a.end(),cur) - a.begin();
				if(at == 0){
					dp[i][j] = 0;
				}else{
					at--;
					dp[i][j] = min(dp[i][j],dp[at][j-1]);
					// if(i)dp[i][j] = min(dp[i][j],dp[i-1][j]+1);
				}
			}
			cur = a[i] - w + 1;
			if(cur <= 0)dp[i][j] = 0;
			else{
				int at = lower_bound(a.begin(),a.end(),cur) - a.begin();
				if(at == 0){
					dp[i][j] = 0;
				}else{
					at--;
					dp[i][j] = min(dp[i][j],dp[at][j]+1);
					// if(i)dp[i][j] = min(dp[i][j],dp[i-1][j]+1);
				}
			}
		}
	}
	// if(w == 9)cout << dp[7][2] << endl;
	return dp[n-1][b] <= s;
}

int main(){
	cin>>n>>s>>b;
	s = min(s,n);
	b = min(b,n);
	a.resize(n);
	for(int i=0;i<n;i++)cin>>a[i];
	sort(a.begin(),a.end());
	int md,lo=0,hi=1e9,ans = 0;
	while(lo <= hi){
		md = (lo + hi)/2;
		if(can(md)){
			ans = md;
			hi = md-1;
		}else lo = md+1;
	}
	cout << ans << endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 768 KB Output is correct
2 Incorrect 2 ms 256 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 102 ms 16120 KB Output is correct
2 Correct 3 ms 384 KB Output is correct
3 Execution timed out 1062 ms 16256 KB Time limit exceeded
4 Halted 0 ms 0 KB -