제출 #1251802

#제출 시각아이디문제언어결과실행 시간메모리
1251802efex12구경하기 (JOI13_watching)C++20
50 / 100
552 ms327680 KiB
#include<bits/stdc++.h>
#define pint pair<int,int>
#define N 2005
#define pb push_back
#define ff first
#define ss second
#define mod 1000000007
#define INF 1000000005
#define pu push
 
using namespace std;

int n,a,b;
int arr[N],num;
int dp[N][N];
pint go[N];

inline int f(int ind,int x)
{
    if(x<0)
        return INF;
    if(dp[ind][x]!=-1)
        return dp[ind][x];
    if(ind==n)
        return 0;
    if(go[ind].ff==0)
    {
        int goa=lower_bound(arr,arr+n,arr[ind]+num)-arr;
        int gob=lower_bound(arr,arr+n,arr[ind]+2*num)-arr;
        go[ind].ff=goa;
        go[ind].ss=gob;
    }
    return dp[ind][x]=min(f(go[ind].ff,x-1),f(go[ind].ss,x)+1);
}

int32_t main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n>>a>>b;
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }
    sort(arr,arr+n);
    if((a+b)>=n)
    {
        cout<<"1\n";
        return 0;
    }
    int l=0,r=1000000002/(a+b)+100;
    int ans=r;
    while(l<=r)
    {
        memset(dp,-1,sizeof(dp));
        memset(go,0,sizeof(go));
        int mid=(l+r)/2;
        num=mid;
        if(f(0,a)<=b)
        {
            ans=min(ans,mid);
            r=mid-1;
        }
        else
        {
            l=mid+1;
        }
    }
    cout<<ans<<endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...