top1编程
← 返回题目
题解

【提高】跳石头

1 条题解

  • 0
    @ 2026-7-28 22:10:03
    #include<bits/stdc++.h>
    using namespace std;
    long long l,n,m;
    int a[50005];
    bool f(int x){
    	int last=0;
    	int s=0;//要移走的数量
    	for(int i=1;i<=n;i++){
    		if(a[i]-last<x){//能移走
    			s++;//移走数量+1
    		}else{
    			last=a[i];//更新上一个的位置
    		}
    	}
    	if(l-last<x){//最后一段
    		s++;
    	}	
    	if(s<=m){//搬走的数量符合要求
    		return true;
    	}else{
    		return false;
    	}
    }
    int main(){
    	cin>>l>>n>>m;
    	for(int i=1;i<=n;i++){
    		cin>>a[i];
    	}
    	int z=1,y=l;
    	while(z<=y){
    		int mid=z+(y-z)/2;
    		if(f(mid)==true){//符合要求
    			z=mid+1;//扩大距离
    		}else{
    			y=mid-1;//缩小距离
    		}
    	}
    	cout<<z-1;
    	
    	return 0;
    }
    
    • 1