题目名字
跳石头(二分)
题目链接
题意
移走给定的石头数量,使这个赛道最短
思路
- 每个石头之间的距离依次比较,移走距离最短的石头
- 判断移走石头数量是否在给定的数量内
算法一:XX+XX
时间复杂度
$
代码
#include<iostream>
using namespace std;
const int n=1e6+10;
int L,M,N;
int a[n];
int check(int step)//step表两块石头之间的最短跳跃距离
{
int location = 0;//现在所在的位置
int count = 0;//移走石头的数量
for(int i = 1 ; i <= N+1 ; i++)
{
if(a[i] - a[location] < step)
{
count++;
}
else location = i;
}
if(count <= M) return 1;
//确保在给定的距离下移走的石头不超过M
//小于M,说明还可以移走更多石头
else
return 0;
}
int main()
{
cin >> L >> N >> M;
for(int i=1;i<=N;i++) cin>>a[i];
a[N+1] = L;//终点
int ans ,left = 0,right = L;
while(left <= right)
{
int mid = left + right >> 1;
if(check(mid)){
ans = mid;
left = mid + 1;
}
else right = mid - 1;
}
cout<<ans;
return 0;
}