题目:
AC通过图如下
简短的AC代码如下
:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int l, n, m;
cin >> l >> n >> m;
int arr[50001];
int now, left, right, mid;
left = 0;
right = l;
//给2位置变量初始化数值;
for (int i = 1; i <= n; i++)
{
cin >> arr[i];
}
arr[0] = 0;
int sum;//记录搬走的石块总和;初始化为0;
int length=0;//用来记录最后的答案;
while (left <= right)//约束条件 也就是循环判断结束的终点
{
now = 0;//每次开始时必须保证位置在起始点
sum = 0;//必须还原sum=0;
mid = (left + right) / 2;
for (int i = 1; i <= n; i++)
{
if (arr[i] - arr[now] < mid)
{
sum++;//移走石块
continue;//然后进行下一次循环判断现在的距离是否比mid大
}
else
now = i;//满足条件后 跳到下一块石头上;
}
if (sum <= m)
{
length = mid;//存储答案;
left = mid + 1; //但是有可能比mid更大一点 往右边再次二分
//+1的原因 最后会确定一个最大的最小值 有可能会存在mid和left
//相等的情况 那就死循环了 如果满足 就应该letf=mid+1来向
//left和right间缩进距离
}
else
{
right = mid - 1;
//必须-1再进行二分 因为最后判断的格子是在letf和right
//这个闭区间上确定一个点 若是mid不行则mid必不可能是答案 则right=mid
//也必不可能 所以直接减1进行 判断 left=mid+1也同理
}
}
printf("%d", length);
return 0;
}