P2678跳石头

#include <bits/stdc++.h>
const int maxn = 500010;
using namespace std;
int a[maxn];
int l,n,m;//起点到终点的距离,起点和终点之间的岩石数,至多移走的岩石数
bool check(int val)
{
    
    
    int cnt = 0,pre = 0;//当前位置,已经移走的石头数目
    for(int i = 1;i < n + 1;i++)
    {
    
    
        if(a[i] - a[pre] < val)cnt++;
        else pre = i;
        if(cnt > m)return false;
    }
    return cnt <= m;
}
int main()
{
    
    
    int ans;
	scanf("%d%d%d",&l,&n,&m);
	for(int i = 1;i <= n;i++)
        scanf("%d",&a[i]);
    a[n + 1] = l;
    int left = 0,right = l;
    while(left <= right)
    {
    
    
        int mid = (left + right) / 2;
        if(check(mid))left = mid + 1,ans = mid;
        else right = mid - 1;
    }
    cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42937838/article/details/108967853
今日推荐