我虽然知道别人的代码是怎么一回事,但是下次遇到类似的不确定能不能独立写出来,有点头大。
不是很懂二分的思想吧
这题就是 你删去count块石头,使最小距离变成mid;代码要做的事就是找到count,再比较m与count的大小划分区间,接着查找
直到
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
int a[50005];
int l,n,m;
int solve(int high,int low)
{
while(low<=high)
{ //找到使最小间距为mid时的石头数量count;
int mid=(high+low)>>1;//需要判断的
int count = 0;//可以去掉的垫脚石数量
int s=0,e=1;
while(e<n)
{
if(a[e]-a[s]>=mid)//一个一个距离判
s=e,e++;
else e++,count++;
}
//mid越大,需要删的count越多
if(count>m)//删掉石头个数的大于m 就说明mid大了,所以需要缩小high
high=mid-1;
else low=mid+1;//同上
}
return high;
}
int main()
{
cin>>l>>n>>m;
a[0]=0;a[n+1]=l;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
n=n+2;
sort(a,a+n);
int low=0x3f3f3f3f;
for(int i=0;i<n;i++)
{
low=min(low,a[i+1]-a[i]);
}
cout<<solve(l,low);
}
但是我还没懂那个边界为什么是(low<=high),底下为什么要用low=mid+1;和high=mid-1;