제출 #976056

#제출 시각아이디문제언어결과실행 시간메모리
976056vjudge1구경하기 (JOI13_watching)C++17
100 / 100
284 ms31968 KiB
#include<bits/stdc++.h> using namespace std; #define int long long int nextp[2005],nextq[2005]; int a[2000+4]; int memo[2005][2005]; int n,p,q; int dp(int idx,int p){ if(p<0)return 1e18; if(idx==n+1)return 0; if(memo[idx][p]!=-1)return memo[idx][p]; return memo[idx][p]=min(dp(nextp[idx],p-1),dp(nextq[idx],p)+1); } bool ok(int w){ for(int k=1;k<=n;k++){ nextp[k]=nextq[k]=n+1; for (int j =k+1; j <=n; j++) { if (a[j] - a[k] + 1 > w) { nextp[k] = j; break; } } for (int j = k+1; j <=n; j++) { if (a[j] - a[k] + 1 > 2 * w) { nextq[k] = j; break; } } } memset(memo,-1,sizeof memo); return dp(1,p)<=q; } signed main(){ cin>>n>>p>>q; for(int k=1;k<=n;k++){ cin>>a[k]; } if(p+q>=n){ cout<<1<<endl; return 0; } sort(a+1,a+n+1); int l=1,r=1e9,ans=1e9; while(l<=r){ int mid=(l+r)/2; if(ok(mid)){ ans=min(ans,mid); r=mid-1; } else{ l=mid+1; } } cout<<ans<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...