[Luogu]P2678 跳石头

题目链接:

https://www.luogu.com.cn/problem/P2678

解题思路:

对可能的答案范围进行二分。

[ 1 , L ] \large [1,L] [1,L]内值进行二分,若该搬出所有小于等于该距离石头的数量 c n t \large cnt cnt超过预期 m \large m m,则二分减小;否则二分增大。

代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<set>
#define INF 0x3f3f3f3f 

typedef long long ll;
using namespace std;


int dis,n,m;
const ll MAX_SIZE  = 1e5+5;

int stones[MAX_SIZE]={0};
int tap[MAX_SIZE]={0};

int chck(int distance){
 	//查询搬出所有 小于等于distance间距的石头是否可行。
 	int cnt=0,pre=0;
 	for(int i=1;i<=n+1;i++){
 	if(stones[i]-pre<=distance)  cnt++;
 	else                         pre=stones[i];
 	}
 
 	if(cnt>m)   return 1;
 	else        return 0;
}    



int main() {
 	int l,r,mid;
 	cin >> dis >> n >> m;

 	//输入的时候记得把n+1给记上。
 	for(int i=1;i<=n;i++)
 		cin >> stones[i];
 	stones[n+1]=dis;
 	
 	//二分初始化
 	l=1,r=dis,mid =(l+r)/2;
 	
 	//开始二分
 	while(l<r){
 	if(chck(mid)==1){    //超预算了(即删多了)。
 			r=mid;
 			mid=(l+r)/2;
     }
     else{
         l=mid+1;
         mid=(l+r)/2;
 	}
 	}
 	cout << mid;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值