【洛谷】P2678 跳石头

原题链接:https://www.luogu.com.cn/problem/P2678

目录

[1. 题目描述](#1. 题目描述)

[2. 思路分析](#2. 思路分析)

[3. 代码实现](#3. 代码实现)


1. 题目描述

2. 思路分析

二分答案。(使用二分需要满足两个条件。一个是有界 ,一个是单调

这题的题面:使得选手们在比赛过程中的最短跳跃距离尽可能长 。如果题目规定了"最大值最小 "或者"最小值最大"的东西,那么这个东西应该就满足二分答案的有界性和单调性)

定义三个变量d,n,m分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。开一个数组a,数组的第i个元素a[i]表示第i个石头与起点的距离。

定义左边界l=0表示起点的石头,右边界r=d+1,表示终点的石头。

套用二分模板,这里要写一个check()函数。形参x表示当前二分出来的答案。cnt代表计数器,记录以当前答案需要移走的实际石头数。i代表下一块石头的编号。now代表当前跳石头的人所在的位置。

写一个while循环(这里注意循环结束的条件是i<n+1,因为终点那块石头是n+1,而不是n)

判断距离(if(a[i]-a[now]<x)),看二者之间的距离算差值就好。

判定成功,把这块石头拿走(cnt++),继续考虑下一块石头。

判定失败,这块石头不用拿走,我们就跳过去(now=i),再考虑下一块。

3. 代码实现

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 50010;
int d, n, m, ans;
int a[N];

bool check(int x) { 
	int cnt = 0;
	int i = 0, now = 0;
	while (i < n + 1) {
		i++;
		if (a[i] - a[now] < x) cnt++;
		else now = i;
	}
	if (cnt > m) return false;
	else return true;
}


int main() {
	cin >> d >> n >> m;
	for (int i = 1; i <= n; i++) cin >> a[i];
	int l = 0, r = d + 1;
	a[0] = 0;
	a[n + 1] = d;
	while (l + 1 < r) {
		int mid = (l + r) / 2;
		if (check(mid)) l = mid;
		else r = mid;
	}
	cout << l << endl;
	return 0;
}

	
相关推荐
Coovally AI模型快速验证21 分钟前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
一只小bit24 分钟前
C++之初识模版
开发语言·c++
可为测控1 小时前
图像处理基础(4):高斯滤波器详解
人工智能·算法·计算机视觉
Milk夜雨1 小时前
头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)
算法·贪心算法
CodeClimb1 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
BoBoo文睡不醒2 小时前
动态规划(DP)(细致讲解+例题分析)
算法·动态规划
apz_end2 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹3 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法
北顾南栀倾寒3 小时前
[Qt]系统相关-网络编程-TCP、UDP、HTTP协议
开发语言·网络·c++·qt·tcp/ip·http·udp
CM莫问3 小时前
python实战(十五)——中文手写体数字图像CNN分类
人工智能·python·深度学习·算法·cnn·图像分类·手写体识别