蓝桥杯 第 1 场算法双周赛 第三题 分组【算法赛】c++ 贪心+双指针

题目

分组【算法赛】

难度: 中等

问题描述

蓝桥小学要进行弹弹球游戏,二年级一班总共有 n 个同学,要求分成 k 个队伍,由于弹弹球游戏要求队员的身高差不能太大,小蓝是班长,他对这个事情正在发愁,他想问你,如何最小化每个组之间的身高极差。

具体的,假设分成了 k 个组,第 i 组最高的人身高是 Hxi​ ,最矮的是 Hni​,你被要求最小化表达式: max⁡1≤i≤k max​(Hxi​−Hni​) 。直白来说,你需要将 n 个元素分出 k 组,使得最大的极差尽可能小。你需要输出这个最小化后的值。

输入格式

第一行输入两个整数 n,k 。

第二行输入 n 个整数:h1​,h2​,h3​...hn​ ,分别代表 n 个人的身高。

输出格式

输出一个整数,代表最小值。

样例输入

5 3
8 4 3 6 9

样例输出

1

说明

样例分组情况:{ 3,43,4 } ,{ 66 } ,{ 8,98,9 } 。

评测数据规模

数据范围: 1≤k≤n≤105,1≤hi​≤109 。

运行限制

语言最大运行时间最大运行内存
C++1s256M
C1s256M
Java2s256M
Python33s256M
PyPy33s256M

思路和解题方法

(注释:楼房等于学生,楼高等于身高)

  1. #include <iostream>:包含输入输出流库,提供与标准输入输出设备的接口。
  2. #include <vector>:包含向量库,提供向量容器及其操作。
  3. #include <algorithm>:包含算法函数库,提供各种常用的算法操作。
  4. using namespace std;:使用std命名空间,简化对标准库的调用。
  5. bool check(vector<int>& heights, int k, int max_diff):定义一个函数,用于检查是否可以将数组分成不超过k个连续子序列,且每个子序列中的最大值和最小值之差不超过max_diff。
  6. int main():主函数,程序的入口。
  7. cin >> n >> k;:从标准输入读取两个整数,分别赋值给变量n和k,表示楼房个数和要求的连续子序列数量。
  8. vector<int> heights(n);:声明一个具有n个元素的向量heights,用于存储每个楼房的高度。
  9. for (int i = 0; i < n; ++i) cin >> heights[i];:循环n次,从标准输入读取每个楼房的高度,并存储到向量heights中。
  10. sort(heights.begin(), heights.end());:对楼房的高度进行升序排序,以便后面的二分查找。
  11. int l = 0, r = heights[n - 1] - heights[0];:定义二分查找的左边界l和右边界r,初始分别为0和最大高度和最小高度之差。
  12. while (l < r):当左边界l小于右边界r时,执行二分查找。
  13. int mid = l + (r - l) / 2;:计算中间值mid,这样可以避免整数溢出。
  14. if (check(heights, k, mid)) r = mid;:如果可以将数组分成不超过k个连续子序列,且每个子序列中的最大值和最小值之差不超过mid,则更新右边界r为mid。
  15. else l = mid + 1;:否则更新左边界l为mid+1。
  16. cout << l << endl;:输出最小的最大差值。
  17. return 0;:返回0,表示程序正常结束。

复杂度

        时间复杂度:

                O(n*log n)

时间复杂度是O(nlogn),其中n是楼房的个数。主要包括排序操作和二分查找操作。

排序操作的时间复杂度为O(nlogn),即对楼房的高度进行升序排序。

二分查找操作的时间复杂度为O(logN),其中N表示最大高度和最小高度之差。每次查找都将搜索空间缩小一半,直到找到最小的最大差值。

因此,整个算法的时间复杂度为O(nlogn + logN),可以近似视为O(nlogn)。

        空间复杂度

                O(n)

算法的空间复杂度是O(n),用于存储楼房的高度。

c++ 代码

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 检查是否可以将数组分成不超过k个连续子序列,且每个子序列中的最大值和最小值之差不超过max_diff
bool check(vector<int>& heights, int k, int max_diff) {int cnt = 1; // 计数器cnt,记录分割出的子序列个数,默认为1int cur = heights[0]; // 当前子序列的起始值,初始为数组第一个元素的高度int n = heights.size(); // 数组的长度for (int i = 1; i < n; i++) { // 从第二个元素开始遍历数组if (heights[i] - cur > max_diff) { // 如果当前元素和起始值的差大于max_diffcnt++; // 分割出一个新的子序列cur = heights[i]; // 更新当前子序列的起始值为当前元素的高度}}return cnt <= k; // 返回是否分割出的子序列个数小于等于k
}int main() {int n, k;cin >> n >> k; // 输入n和kvector<int> heights(n); // 声明一个具有n个元素的向量heights,存储每个楼房的高度for (int i = 0; i < n; ++i) {cin >> heights[i]; // 输入每个楼房的高度并存储到向量heights中}sort(heights.begin(), heights.end()); // 对楼房的高度进行升序排序int l = 0; // 定义二分查找的左边界l,初始为0int r = heights[n - 1] - heights[0]; // 定义二分查找的右边界r,初始为最大高度和最小高度之差while (l < r) { // 当左边界小于右边界时,执行二分查找int mid = l + (r - l) / 2; // 计算中间值midif (check(heights, k, mid)) { // 如果可以将数组分成不超过k个连续子序列,且每个子序列中的最大值和最小值之差不超过midr = mid; // 更新右边界为mid} else {l = mid + 1; // 更新左边界为mid+1}}cout << l << endl; // 输出最小的最大差值return 0;
}

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

【多媒体技术与实践】使用OpenCV处理图像(实验三.上)

1&#xff1a;图像直方图 将原彩色图像转成灰度图像&#xff0c;得到该灰度图像的灰度直方图&#xff0c;并对灰度直方图进行直方图均衡化&#xff0c;将原图、灰度图、直方图及均衡化后的直方图一起拼接为一张图片 import cv2 import numpy as np import matplotlib.pyp…

浅谈压力测试的作用是什么

随着现代应用程序变得越来越复杂&#xff0c;用户的期望也在不断提高&#xff0c;对性能和可靠性的要求变得更加苛刻。在应用程序开发和维护的过程中&#xff0c;压力测试是一项至关重要的活动&#xff0c;它可以帮助发现潜在的问题、评估系统的性能极限&#xff0c;以及确保在…

4、在 CentOS 8 系统上安装 pgAdmin 4

pgAdmin 4 是一个开源的数据库管理工具&#xff0c;专门用于管理和操作 PostgreSQL 数据库系统。它提供了一个图形用户界面&#xff08;GUI&#xff09;&#xff0c;使用户能够轻松地连接到 PostgreSQL 数据库实例&#xff0c;执行 SQL 查询&#xff0c;管理数据库对象&#xf…

MySQL简介

数据库管理系统 1、关系型数据库管理系统: Oracle:Oracle是一种商业级关系型数据库管理系统,支持高可用性、高安全性以及广泛的企业级应用需求。SQL Server:SQL Server是Microsoft开发的企业级关系型数据库管理系统,广泛应用于Windows环境下的软件开发。MySQL:MySQL是一…

智能指针与定制删除器

定制删除器 前面我们的智能指针就是&#xff1a; RAII。 像指针一样。 但是我们的智能指针的析构函数就只是 delete。 // 这里简单的看一下 shared_ptr 就知道了~shared_ptr(){if (--(*_pcount) 0){delete _ptr;delete _pcount;}} 那么如果我们想要 new[] 呢&#xff1f…

基于知识图谱建模、全文检索的智能知识管理库(源码)

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 知识图谱提供了一种从海量文本和图像中抽取结…

2023大联盟2比赛总结

比赛链接 反思 T1 奇怪的贪心和构造题一直是我的软肋部分 T2 简单题 T3 也不难 T4 套路没学过&#xff0c;感觉还是太菜了 题解 A 考虑先给图随便染色&#xff0c;然后调整 因为每个点的度数为 3 3 3&#xff0c;所以如果有 x → u → v x\to u\to v x→u→v 的颜…

自定义类型:结构体,枚举,联合 (2)

2. 位段 位段的出现就是为了节省空间。 2.1 什么是位段 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 1.位段的成员必须是 int、unsigned int 或signed int 。 2.位段的成员名后边有一个冒号和一个数字。 比如&#xff1a; struct A {int _a:2;int _b:5;int…

Pygame中将鼠标形状设置为图片2-2

3 编写主程序 在主程序中&#xff0c;首先创建屏幕并且完成一些准备工作&#xff0c;之后在while循环中不断更新sprite实例即可。 3.1 创建屏幕及准备工作 创建屏幕及准备工作的代码如图5所示。 图5 创建屏幕及准备工作 其中&#xff0c;第20行代码调用pygame.mouse模块中的…

Hadoop3教程(五):NameNode和SecondaryNameNode

文章目录 &#xff08;59&#xff09;NN和2NN的工作机制&#xff08;60&#xff09;FsImage镜像文件&#xff08;61&#xff09;Edits编辑日志&#xff08;62&#xff09;Checkpoint时间设置参考文献 &#xff08;59&#xff09;NN和2NN的工作机制 NameNode的数据是存储在磁盘…

思维模型 正/反 木桶理论

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。 1 正/反 木桶理论的应用 1.1 木桶理论的应用 1.1.1 正木桶理论在考试中的应用 小明是一名理科高中生&#xff0c;他在学习过程中发现自己在数理化方面表现较好&#xff0c;但在语文和英…

【02】基础知识:React - jsx语法规则

一、jsx 简介 全称为JavaScript XML&#xff0c;是 react 定义的一种类似于 XML 的 JS 扩展语法 JS XML 本质是 React.createElement(component, props, …children) 方法的语法糖&#xff0c;用来简化创建虚拟 DOM 写法&#xff1a;var ele <h1>Hello JSX!</h1&…

多个Python包懒得import,那就一包搞定!

使用Python时&#xff0c;有的代码需要依赖多个框架或库者来完成&#xff0c;代码开头需要import多次&#xff0c;比如&#xff0c; import pandas as pd from pyspark import SparkContext from openpyxl import load_workbook import matplotlib.pyplot as plt import seabo…

bootz启动 Linux内核涉及do_bootm_linux 函数

一. bootz启动Linux uboot 启动Linux内核使用bootz命令。当然还有其它的启动命令&#xff0c;例如&#xff0c;bootm命令等等。 本文只分析 bootz命令启动 Linux内核的过程中涉及的几个重要函数。具体分析 do_bootm_linux函数执行过程。 本文继上一篇文章&#xff0c;地址…

[netty-websocket-boot-starter] 基于Netty的轻量级、高性能的WebSocket框架

简介 这是一个轻量级、高性能的基于 Netty 的 WebSocket 框架&#xff0c;提升你的 WebSocket 开发体验&#xff0c;为 Spring Boot 带来全新的 WebSocket 功能。 该项目使你可以轻松集成 WebSocket 到你的 Spring Boot 项目中&#xff0c;提供了 Tomcat WebSocket 的简单性&a…

windows flask 多进程高并发

最近在做的一个项目&#xff0c;需要将十几个python函数封装程flask服务供外界调用&#xff0c;每个函数之间没有什么关系&#xff0c;相互独立。虽然感觉不是很难&#xff0c;但因为用的windows系统&#xff0c;遇到的坑比较多&#xff0c;在此一一总结一下。 flask偶尔出现卡…

多线程并发篇---第十二篇

系列文章目录 文章目录 系列文章目录一、说说ThreadLocal原理?二、线程池原理知道吗?以及核心参数三、线程池的拒绝策略有哪些?一、说说ThreadLocal原理? hreadLocal可以理解为线程本地变量,他会在每个线程都创建一个副本,那么在线程之间访问内部 副本变量就行了,做到了…

服务供应商安全管理制度

1、总则 1.1、目的 为了规范XXXXX单位信息系统建设和运行过程中服务商的选择&#xff0c;按照信息安全等级保护要求进行服务商管理&#xff0c;特制定本管理规范。 1.2、范围 本办法适用于XXXXX单位在信息化建设和运行过程中服务商选择的安全管理。 1.3、职责 较小项目由…

燃气管网监测系统,让城市生命线更安全

万宾科技燃气管网监测系统&#xff0c;让城市生命线更安全 城市是现代社会的中心&#xff0c;拥有庞大的人口和各种基础设施&#xff0c;以满足人们的生活需求。城市基础设施包括供热&#xff0c;供水&#xff0c;管廊&#xff0c;河湖&#xff0c;建筑&#xff0c;排水&#x…

JavaScript class和function的区别

待整理&#xff1a; 一 二 Class 组件和 Function 组件是 React 中创建组件的两种主要方式。他们在语法和功能上有一些不同。以下分点是 Class 组件和 Function 组件在不同方面的对比&#xff1a; 1. 语法结构 Class 组件&#xff1a; import React, { Component } from …