lanqiao OJ 364 跳石头

news2024/11/22 8:08:40

这个题目的条件是移动的石头数量给定,但是最小移动距离的最大值我们不知道,所以要通过mid来“猜测”。如果当前的mid需要移动的最小石头数量超过给定数,则mid不成立,需要缩小,反之则增大mid,直至找到一个最大且符合移动数量的mid。

在实现“消去”岩石的过程中,我们实际上是在模拟移除岩石的操作,以检查在给定的条件下(即移除不超过M块岩石),剩余岩石之间的最小距离能否达到某个特定的值(即二分搜索中的mid值)。

“ 消 去 ” 石 头 

以下是实现“消去”岩石的一般步骤,结合“跳石头”比赛的问题来说明:

  1. 初始化变量
    • 设定一个计数器来记录已经移除的岩石数量。
    • 设定一个变量来跟踪上一个保留的岩石的位置(初始时可以是起点的位置)。
  2. 遍历岩石
    • 对于河道中的每一块岩石(除了起点和终点),执行以下步骤:
  3. 检查距离
    • 计算当前岩石与上一个保留的岩石之间的距离。
    • 如果这个距离小于当前的mid值,说明需要移除一块岩石来增大距离。
  4. 执行消去
    • 在这种情况下,我们选择“消去”当前遍历到的岩石(这是一种贪心策略,也可以选择其他策略,但这种方法通常有效)。
    • 增加移除岩石的计数器。
    • 不更新上一个保留的岩石的位置,因为当前岩石已经被“消去”了。
  5. 保留岩石
    • 如果当前岩石与上一个保留的岩石之间的距离大于或等于mid值,说明当前岩石可以保留。
    • 更新上一个保留的岩石的位置为当前岩石的位置。
  6. 检查终点距离
    • 遍历完所有岩石后,还需要检查从最后一个保留的岩石到终点的距离是否小于mid值。
    • 如果是,那么也需要“消去”一块岩石(在逻辑上,这可以视为在终点前需要一块被移除的“虚拟岩石”),并增加移除岩石的计数器。
  7. 验证移除数量
    • 最后,检查移除岩石的计数器是否小于或等于M。
    • 如果是,说明当前的mid值可以通过移除不超过M块岩石来实现,返回true。
    • 否则,返回false。

在代码中,这个过程通常是在一个名为check的函数中实现的,该函数接受mid值和岩石位置数组作为参数,并返回一个布尔值来表示是否可以通过移除不超过M块岩石来使得剩余岩石之间的最小距离至少为mid。

通过这种方式,我们可以在二分搜索的过程中不断地“猜测”和验证最小移动距离的最大可能值,直到找到一个既满足条件又最大的值。

f(mid)为了使所有岩石的最小间隔为mid,所需要移动的数量。

最小距离越大,移动数量越多

最小距离越小,移动数量越少

#include<bits/stdc++.h>

using namespace std;
const int N=5e4+9;
int a[N];
int L,n,m;

int check(int mid)	//给定一个mid最后返回移动石头的数量 
{
	int res=0,lst=0;	 // res: “结果 ”表示已经移除的石头个数。 
	for(int i=1;i<=n;i++)// lst:上一个保留石头的位置 
	{
		if(a[i]-a[lst]<mid)//如果两个石头之间的距离<mid,则这个需要移除,
		{				   //然后保留lst(标志)不变,i++进行下一个比较。 
						  
			res++;		  //这一部分是将i移除 
		}else{
			lst=i;	
		}
	}
	
	if(L-a[lst]<mid)	//这一部分是将lst移除; 效果和删除最后一个是相同的 
	{					//不会删除第一个 若删除第一个则说明已
		res++;			//经删除了n+1>m(n表示起点和终点之间的岩石个数)个, 
						//m表示最多移动的岩石数量 
	}					// 而在输入的时候m<=n,可以理解为只能删除起点和终点之间的石头。 
	
	return res;
}

int main()
{
	cin>>L>>n>>m;
	int i;
	for(i=0;i<+n;i++)	//好像写入数组的时候都习惯于在i=1开始 
	{
		cin>>a[i]; 		//这是一个关于mid的数组 
	}
	
	int l=0,r=1e9+5;
	
	//进入二分查找 
	while(l+1!=r)	//二分查找的结果一定是找到数组中一个合适的数字 
					//此时的数组是表示mid,也就是最小距离。
					//或许这里找的是一个最佳的最小距离 
	{				//但是这是在二分查找什么呢? 
		int mid=(l+r)/2; 
		if(check(mid)<=m)	 
		{
			l=mid;
		}
		else{
			r=mid;
		}
	}
	
	cout<<L<<'\n';	//l表示的是一个合适的距离 
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「一」HarmonyOS端云一体化概要

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…

Shell基础(7)

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…

音视频pts/dts

现在的视频流有两个非常重要的时间戳&#xff0c;pts和dts&#xff0c;其中pts是显示的时候用&#xff0c;dts在解码的时候用。 pts很好理解&#xff0c;按照pts的顺序以及duration不间断的display就可以了。 dts在解码的时候用&#xff0c;那么这句话怎么理解&#xff0c;解…

sql server怎样用sql profiler捕获带变量值的慢sql

一 新建跟踪 点击工具-SQL Server Profiler&#xff1a; 点击文件-新建跟踪的按钮&#xff1a; 在‘事件选择’选项卡只选择如下两项内容&#xff08;RPC:Completed,SQL:BatchCompleted&#xff09;&#xff0c;把多余的取消勾选&#xff1a; 然后勾选上面截图中右下方的‘显示…

二叉树——输出叶子到根节点的路径

目录 代码 算法思想 例子 思维拓展 代码 int LeaveBit(Bitree T,int flag,int g) {if (!T) {return 0;}if (T->rchild NULL && T->lchild NULL) {//cout << "empty:" << T->data << endl;s.push(T->data);while (!s.emp…

深入理解Spring(三)

目录 2.1.3、Spring配置非自定义Bean 1)配置Druid数据源交由Spring管理 2)配置Connection交由Spring管理 3)配置日期对象交由Spring管理 4)配置MyBatis的SqlSessionFactory交由Spring管理 2.1.4、Bean实例化的基本流程 1)Bean信息定义对象-BeanDefinition 2)DefaultLi…

React Native 基础

React 的核心概念 定义函数式组件 import组件 要定义一个Cat组件,第一步要使用 import 语句来引入React以及React Native的 Text 组件: import React from react; import { Text } from react-native; 定义函数作为组件 const CatApp = () => {}; 渲染Text组件

SpringBoot,IOC,DI,分层解耦,统一响应

目录 详细参考day05 web请求 1、BS架构流程 2、RequestParam注解 完成参数名和形参的映射 3、controller接收json对象&#xff0c;使用RequestBody注解 4、PathVariable注解传递路径参数 5、ResponseBody&#xff08;return 响应数据&#xff09; RestController源码 6、统一响…

Linux:confluence8.5.9的部署(下载+安装+pojie)离线部署全流程 遇到的问题

原文地址Linux&#xff1a;confluence8.5.9的部署&#xff08;下载安装破ji&#xff09;离线部署全流程_atlassian-agent-v1.3.1.zip-CSDN博客 背景&#xff1a;个人使用2核4g 内存扛不住 总是卡住&#xff0c;但是流程通了所以 直接公司开服务器干生产 个人是centos7 公司…

线程池的实现与应用

一、线程池 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用&#xff0c…

.net 8使用hangfire实现库存同步任务

C# 使用HangFire 第一章:.net Framework 4.6 WebAPI 使用Hangfire 第二章:net 8使用hangfire实现库存同步任务 文章目录 C# 使用HangFire前言项目源码一、项目架构二、项目服务介绍HangFire服务结构解析HangfireCollectionExtensions 类ModelHangfireSettingsHttpAuthInfoUs…

EventListener与EventBus

EventListener JDK JDK1.1开始就提供EventListener&#xff0c;一个标记接口&#xff0c;源码如下&#xff1a; /*** A tagging interface that all event listener interfaces must extend.*/ public interface EventListener { }JDK提供的java.util.EventObject&#xff1…

优先级队列PriorityQueue(堆)

1. 优先级队列 队列是一种先进先出的数据结构,而如果我们操作的数据带有优先级,我们出队的时候就会先出队优先级最高的元素.比如打游戏的时候有人给你打电话,操作系统看来有俩个进程,优先会处理打电话. 主要功能 1> 返回最高优先级对象 2> 添加新的对象 2. 堆的概念 2.1 …

【AI】人工智能报告解读——中国人工智能的发展

自 2016 年 AlphaGo 与世界顶级围棋选手对战后&#xff0c;AI 概念和技术从此走入大众视野。2017 年&#xff0c;国务院颁布《新一代人工智能发展规划》&#xff0c;这是中国在人工智能领域第一个部署文件&#xff0c;确定了人工智能产业发展的总体思路、战略目标和任务。技术和…

Flutter:photo_view图片预览功能

导入SDK photo_view: ^0.15.0单张图片预览&#xff0c;支持放大缩小 import package:flutter/material.dart; import package:photo_view/photo_view.dart;... ...class _MyHomePageState extends State<MyHomePage>{overrideWidget build(BuildContext context) {return…

uni-app 修改复选框checkbox选中后背景和字体颜色

编写css&#xff08;注意&#xff1a;这个样式必须写在App.vue里&#xff09; /* 复选框 */ /* 复选框-圆角 */ checkbox.checkbox-round .wx-checkbox-input, checkbox.checkbox-round .uni-checkbox-input {border-radius: 100rpx; } /* 复选框-背景颜色 */ checkbox.checkb…

c++中mystring运算符重载

#include <iostream> #include <cstring>using namespace std;class mystring {char* buf; public:mystring(); //构造函数mystring(const char * str); //构造函数mystring(const mystring& str); //深拷贝函数void show(); //输出函数void setmystr(const my…

oracle数据恢复—通过拼接数据库碎片的方式恢复Oracle数据的案例

Oracle数据库故障&#xff1a; 存储掉盘超过上限&#xff0c;lun无法识别。管理员重组存储的位图信息并导出lun&#xff0c;发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组…

SpringBoot中小企业人事管理系统:设计模式

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;中小企业人事管理系统当然也不能排除在外。中小企业人事管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和…

git分支合并某一次提交

1.A分支&#xff1a;使用git log --oneline查看需要合并的id 或者直接去Git仓库查看提交记录 2.B分支&#xff1a;git cherry-pick id 合并A分支的请求