对于每次二分的 mid 最小需要跳跃的距离,进行一次检查,对于检查函数,为了确定编号为 i 的岩石之前没有被删除的岩石是哪个,要定义一个 last 存上一个没有被删除的岩石的编号,每次对比 Di 和 Dlast 的差,如果小于我们二分到的距离就说明要移走,否则不要移走更新 last 为 i,如果要移走的岩石小于等于最多可以移走的岩石 m 说明这种情况是可能的,否则不可能。
答案为每个满足的 mid 中的最大值。
注意起点和终点要在数组里,D 数组输入时不会有终点和起点,自行要添加。
代码:
#include<bits/stdc++.h> #define LL long long usingnamespace std; LL l,n,m; LL a[50003],maxx; boolcheck(LL mid){ int last=0,del=0; for(int i=1;i<=n;i++){ if(a[i]-a[last]<mid){ del++; } else last=i; } return del<=m; } intmain(){ cin>>l>>n>>m; for(int i=1;i<=n;i++)cin>>a[i];// 代码中的数组 a 为题目中的数组 D sort(a+1,a+1+n); a[++n]=l; LL r=l,l=1,mid; while(l<=r){ mid=(l+r)/2; if(check(mid)){ l=mid+1; maxx=mid; } else r=mid-1; } cout<<maxx; return0; }