Submission #12954

#TimeUsernameProblemLanguageResultExecution timeMemory
12954gs13068Watching (JOI13_watching)C++98
100 / 100
52 ms16780 KiB
#include<cstdio>
#include<algorithm>

long long c[2002];
int x[2002];
int y[2002];
int d[2002][2002];

int main()
{
	int l,r,mid;
	int i,j,k,n,a,b;
	scanf("%d%d%d",&n,&a,&b);
	if(a+b>=n)
	{
		puts("1");
		return 0;
	}
	for(i=1;i<=n;i++)scanf("%lld",&c[i]);
	std::sort(c+1,c+n+1);
	l=1;
	r=(1e9+a+b+b-1)/(a+b+b);
	for(i=0;i<=n&&i<=a;i++)for(j=0;i+j<=n&&j<=b;j++)d[i][j]=1;
	while(l<r)
	{
		mid=(l+r)/2;
        for(i=1;i<=n;i++)
		{
			x[i]=std::lower_bound(c+i+1,c+n+1,c[i]+mid)-c;
			y[i]=std::lower_bound(c+i+1,c+n+1,c[i]+mid+mid)-c;
		}
		x[n+1]=y[n+1]=n+1;
		for(i=0;i<=n&&i<=a;i++)
		{
			for(j=0;i+j<=n&&j<=b;j++)
			{
				if(d[i][j]>n)break;
				d[i+1][j]=std::max(d[i+1][j],x[d[i][j]]);
				d[i][j+1]=std::max(d[i][j+1],y[d[i][j]]);
				d[i][j]=1;
			}
			if(i+j<=n&&j<=b)break;
		}
        if(i<=n&&i<=a)r=mid;
        else l=mid+1;
        for(k=j;i+k<=n&&k<=b;k++)d[i][k]=1;
        i++;
        for(k=0;i+k<=n&&k<=j;k++)d[i][k]=1;
	}
	printf("%d",l);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...