题意:给你n个点,问你去掉m个点后,使相邻点之间的距离最近的最大。
解法和Monthly Expense差不多~
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[51000],l,n,m,dis[51000];
bool Check(int p)
{
int i,ite,cnt;
ite=0;
cnt=0;
for (i=0; i<n; i++)
{
ite+=dis[i];
if (ite > p)
{
ite=0;
}
else
{
cnt++;
if (cnt > m)
return false;
}
}
return true;
}
int main()
{
int i,j,mi,ma,mid;
scanf("%d%d%d",&l,&n,&m);
for (i=1; i<=n; i++)
{
scanf("%d",a+i);
}
sort(a+1,a+n+1);
a[0]=0;
a[n+1]=l;
n++;
for (i=0; i<n; i++)
{
dis[i]=a[i+1]-a[i];
mi=dis[i]<mi?dis[i]:mi;
}
ma=l;
while (mi < ma)
{
mid=(mi+ma)>>1;
if (Check(mid) == true)
{
mi=mid+1;
}
else
{
ma=mid;
}
}
printf("%d\n",ma);
}