제출 #1344115

#제출 시각아이디문제언어결과실행 시간메모리
1344115minhtien구경하기 (JOI13_watching)C++20
100 / 100
197 ms16136 KiB
#include <bits/stdc++.h>

using namespace std;
const int N=2e3+5;
const int inf=1e9+7;
int dp[N][N];
int a[N];
int l[N],l1[N];
int n,p,q;
int f(int w){
    for(int i=1;i<=n;i++){
        int t=lower_bound(a+1,a+1+n,a[i]-w+1)-a;
        int t1=lower_bound(a+1,a+1+n,a[i]-2*w+1)-a;
        l[i]=t;
        l1[i]=t1;
    }
    for(int i=0;i<=n;i++){
        for(int j=0;j<=n;j++){
            dp[i][j]=inf;
        }
    }
    for(int j=0;j<=n;j++){
        dp[0][j]=0;
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<=min(n,p);j++){
            dp[i][j]=min(dp[i][j],dp[l1[i]-1][j]+1);
            if(j>0){
                dp[i][j]=min(dp[i][j],dp[l[i]-1][j-1]);
            }
        }
    }
    for(int j=0;j<=p;j++){
        if(dp[n][j]<=q){
            return 1;
        }
    }
    return 0;
}
int f1(){
    int l=1,r=inf;
    int tong=inf;
    while(l<=r){
        int m=(l+r)/2;
        int s1=f(m);
        if(s1==1){
            r=m-1;
            tong=min(tong,m);
        }
        else{
            l=m+1;
        }
    }
    return tong;
}
int main()
{
    cin >>n >>p >>q;
    for(int i=1;i<=n;i++){
        cin >> a[i];
    }
    sort(a+1,a+1+n);
    int s2=f1();
    cout << s2;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...