当前位置: 首页 > news >正文

【洛谷】P2678 跳石头

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

目录

1. 题目描述

2. 思路分析

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. 代码实现

#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;
}

 

http://www.lryc.cn/news/142148.html

相关文章:

  • Elasticsearch配置优化
  • Springboot整合minio组件-分布式文件存储
  • 多态/虚函数/虚函数表
  • QT中按钮的基类QAbstractButton
  • 并查集(种类并查集,带权并查集)
  • 飞天使-k8s基础组件分析-控制器
  • 有序充电运营管理平台是基于物联网和大数据技术的充电设施管理系统-安科瑞黄安南
  • LeetCode-227-基本计算器Ⅱ
  • dart 学习列表 List
  • 数据结构--树4.2.1(二叉树)
  • Presto之Driver个数
  • R语言响应面(RSM)、线性模型lm分析生产过程影响因素可视化
  • 剑指Offer --- 字符串篇
  • 7.elasticsearch同步工具-logstah
  • Redis之stream类型解读
  • C++ 网络编程项目fastDFS分布式文件系统(九)总结
  • 第五章 树与二叉树 一、树的定义与考点
  • C语言基础之——指针(下)
  • 小研究 - JVM 的类装载机制
  • 项目---日志系统
  • 设计模式--建造者模式(Builder Pattern)
  • 若依vue打印的简单方法
  • Rust 基础语法学习
  • iOS开发Swift-函数
  • 序列化协议:JSON和XML
  • 江西萍乡能源石油化工阀门三维扫描3d测量抄数建模-CASAIM中科广电
  • Go【gin和gorm框架】实现紧急事件登记的接口
  • 第一个VUE程序?
  • 电阻器件的分类
  • QT基础教程之二 第一个Qt小程序