题目
题意
跳相邻的石头,(有N个),选手最短跳跃距离尽可能长,所以移走最多M块,让距离尽可能长。挪走的不能包含起点和终点的。
思路
1.定义自变量
2.check函数+二分,找出较长距离,移走短距离
3.输出
坑点:第一个和最后一个(起点与终点)要保留
代码:
#include<cstdio>
#include<algorithm>
#define N (50000+10)
using namespace std;
int a[N];
int d,n,m,ans;
bool check(int dis){
int count=0,i=0,last=0;
while (i<n+1){
i++;
if (a[i]-last<dis){
//如果距离小于,那么这块石头需要搬走
count++; }
else{
last=a[i];
}
}
if (count>m) return 0;
else return 1; }
int main()
{
scanf("%d%d%d",&d,&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
a[n+1]=d;
int l=1,r=d,mid;
while (l<=r){
mid=(l+r)/2;
if (check(mid)){
ans=mid;
l=mid+1;
}
else r=mid-1;
}
printf("%d",ans);
}