题目大意:一串上升数,问你去掉m个数字后,相邻数的最大的最小差是多少。
解题报告:二分。再一次感受到二分的强大。要找的是最大的符合条件的数,那么我找最小的不符合条件的数,-1就ok啦。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int d[500010];
int l,r,n,m;
bool judge(int mid)
{
int num=0;
int last=0;
for(int i=1;i<=n;i++)
{
if(d[i]-last<mid)
num++;
else
last=d[i];
}
return num>m;
}
int main()
{
scanf("%d%d%d",&r,&n,&m);
d[++n]=r;
for(int i=1;i<n;i++)
scanf("%d",d+i);
sort(d+1,d+n);
l=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(judge(mid))
r=mid-1;
else
l=mid+1;
}
printf("%d\n",r);
}