蓝桥杯 第 2 场算法双周赛 第3题 摆玩具【算法赛】 c++ 贪心

 题目

摆玩具【算法赛】icon-default.png?t=N7T8https://www.lanqiao.cn/problems/5888/learning/?contest_id=145

问题描述

小蓝是一个热爱收集玩具的小伙子,他拥有 n 个不同的玩具。

这天,他把 n 个玩具按照高度顺序从矮到高摆放在了窗台上,然后,他希望将这些玩具分成 k 个段,使得所有分段的极差之和尽可能小。

具体来说,你需要将一个长度为 n 的序列分为 k 段,我们定义 Gi​ 为第 i 个分段的极差,你要最小化 ∑i=1k​Gi​。

你能帮助小蓝找到最小值是多少吗?

极差:是指每个分段中最高和最矮玩具高度之差,例如有一段为:{3,6,10,12}{3,6,10,12},那么极差为 12−3=912−3=9。

分段:即每一段在原始序列中是一段连续区间,例如将 {1,2,3,4,5}{1,2,3,4,5} 分为两段,{1,2,3}∣{4,5}{1,2,3}∣{4,5} 是合法的,但是 {1,2,4}∣{3,5}{1,2,4}∣{3,5} 不是合法的。

输入格式

第一行输入两个整数 n,k,代表玩具数量和需要分段的数量。

第二行输入 n 个整数 {h1​,h2​,...,hn​},代表每个玩具的高度。

输出格式

输出一个整数,表示最小的极差和。

样例输入

5 2
2 5 7 10 13

样例输出

8

说明

存在多种分段方式,其结果都是最小值:

  1. {2}∣{5,7,10,13}{2}∣{5,7,10,13},极差和为 0+8=80+8=8。
  2. {2,5,7}∣{10,13}{2,5,7}∣{10,13},极差和为 5+3=85+3=8。
  3. {2,5,7,10}∣{13}{2,5,7,10}∣{13},极差和为 8+0=88+0=8。

不存在其他方案使得答案小于 88。

评测数据范围

1≤k≤n≤105 。

1≤h1​≤h2​≤h3​≤...≤hn​≤109 。

运行限制

语言最大运行时间最大运行内存
C++1s128M
C1s128M
Java2s128M
Python33s128M
PyPy33s128M

思路和解题方法

  1. #include <iostream>#include <algorithm>:这两行代码包含了所需的头文件,分别用于输入输出操作和排序操作。

  2. int n;int k, a[100005],b[100005];:这部分代码定义了三个整型变量nk和两个整型数组ab。其中,n表示序列中元素的数量,k表示要删除的元素的数量,a保存原始序列中的元素,b保存相邻元素之间的差值。

  3. void solve():这部分代码定义了一个函数solve,用于解决问题。

  4. cin >> n >> k;:使用输入流cin读取用户输入的序列长度n和要删除的元素数量k

  5. for (int i = 0; i < n; i++) cin >> a[i];:使用循环结构for,依次读取用户输入的序列中的元素,并将它们存储在数组a中。

  6. for (int i = 1; i < n; i++) b[i-1]=a[i]-a[i-1];:使用循环结构for,计算相邻元素之间的差值,并将它们存储在数组b中。注意,数组b的下标从0开始。

  7. sort(b,b+n-1);:使用sort函数,对数组b中的元素进行排序。由于数组b中只有n-1个元素,所以第二个参数为n-1

  8. int sum=0; for(int i=0;i<n-k;++i) {sum+=b[i];}:使用循环结构for,计算前n-k个最小的差值之和,并将结果存储在变量sum中。

  9. cout << sum;:使用输出流cout将结果输出到控制台。

  10. int main():这部分代码定义了主函数main,是程序的入口点。

  11. solve();:调用函数solve解决问题。

  12. return 0;:返回0表示程序正常结束。

复杂度

        时间复杂度:

                O(n*logn)

时间复杂度分析:

  1. 输入序列的长度为n,需要遍历n个元素,所以输入的时间复杂度为O(n)。
  2. 计算相邻元素之间的差值并存储到数组b中,需要遍历n-1个元素,所以该步骤的时间复杂度为O(n)。
  3. 对数组b进行排序,排序的时间复杂度为O(nlogn)。
  4. 计算前n-k个最小差值的和,需要遍历n-k个元素,所以该步骤的时间复杂度为O(n)。
  5. 输出结果的时间复杂度为O(1)。

代码的总时间复杂度为O(nlogn)。

        空间复杂度:

                O(n)

空间复杂度分析:

  1. 数组a和数组b的长度都为n,所以它们的空间复杂度均为O(n)。
  2. 其他变量占用的空间可以忽略不计。

c++ 代码

#include <iostream>
#include <algorithm>
using namespace std;

int n; // 存储序列的长度
int k, a[100005], b[100005]; // k表示要删除的元素数量,a存储原始序列的元素,b存储相邻元素的差值

void solve() {
    cin >> n >> k; // 输入序列的长度和要删除的元素数量

    for (int i = 0; i < n; i++)
        cin >> a[i]; // 输入序列的元素并存储到数组a中

    // 计算相邻元素之间的差值并存储到数组b中
    for (int i = 1; i < n; i++)
        b[i-1] = a[i] - a[i-1];

    sort(b, b+n-1); // 对数组b进行排序

    int sum = 0;
    for (int i = 0; i < n-k; ++i) {
        sum += b[i]; // 计算前n-k个最小差值的和
    }

    cout << sum; // 输出结果
}

int main() {
    solve(); // 调用solve函数解决问题
    return 0;
}

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云对象存储OSS文件无法预览,Bucket设置了Referer

您发起的请求头中没有Referer字段或Referer字段为空&#xff0c;与请求Bucket设置的防盗链策略不相符。 解决方案 您可以选择以下任意方案解决该问题。 在请求中增加Referer请求头。 GET /test.txt HTTP/1.1 Date: Tue, 20 Dec 2022 08:48:18 GMT Host: BucketName.oss-examp…

Docker GitLab-Runner安装

Docker GitLab-Runner安装 GitLab-Runner安装 问题合集GitLab 域名的配置修改Runner容器内注册失败&#xff0c;提示 dial tcp: lookup home.zsl0.com on 192.168.254.2:53: no such host GitLab-Runner 安装 拉去gitlab/gitlab-runner镜像 docker pull gitlab/gitlab-runne…

汽车行驶性能的主观评价方法(1)-底盘校准方法

底盘校准的目的是&#xff0c;从行驶性能和行驶舒适性两个方面进行协调&#xff0c;从而优化行驶动力学特性。为了达到这一目标&#xff0c;工程人员早在设计阶段&#xff0c;就对大多数对行驶动力性有重要意义的部件提出了要求。这些要求不仅与底盘的组件有关&#xff0c;还必…

轻量封装WebGPU渲染系统示例<2>-彩色立方体(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/VertColorCube.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 5. …

超宽带技术在汽车领域的应用

随着科技的不断发展&#xff0c;超宽带&#xff08;Ultra-Wideband, UWB&#xff09;技术在各个领域展现出了强大的潜力&#xff0c;其中汽车领域更是受益匪浅。UWB技术以其高精度的定位能力、高速的数据传输和低功耗的特点&#xff0c;为汽车行业带来了许多创新。本文将探讨UW…

20.1 OpenSSL 字符BASE64压缩算法

OpenSSL 是一种开源的加密库&#xff0c;提供了一组用于加密和解密数据、验证数字证书以及实现各种安全协议的函数和工具。它可以用于创建和管理公钥和私钥、数字证书和其他安全凭据&#xff0c;还支持SSL/TLS、SSH、S/MIME、PKCS等常见的加密协议和标准。 OpenSSL 的功能非常…

安卓开发实例:方向传感器

调用手机的方向传感器&#xff0c;X轴&#xff0c;Y轴&#xff0c;Z轴的数值 activity_sensor.xml <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayoutxmlns:android"http://schemas.android.c…

Git Gui使用技巧

资料 https://www.runoob.com/w3cnote/git-gui-window.html 操作过程 创建仓库→添加远程仓库→扫描目录→文件移动→提交→上传 注意填注释 文件忽略 创建文件.gitignore→编写内容 *.log #文件 config.ini #文件 temp/ #目录

Linux--安装与配置虚拟机及虚拟机服务器坏境配置与连接---超详细教学

一&#xff0c;操作系统介绍 1.1.什么是操作系统 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是一种系统软件&#xff0c;它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源&#xff0c;为应用程序提供接口和服务&#xff0c;并协调…

spark

spark Spark可以将Hadoop集群中的应用在内存中的运行速度提升100倍&#xff0c;甚至能够将应用在磁盘上的运行速度提升10倍。除了Map和Reduce操作之外&#xff0c;Spark还支持SQL查询&#xff0c;流数据&#xff0c;机器学习和图表数据处理。开发者可以在一个数据管道用例中单独…

面试总结之消息中间件

RabbitMQ的消息如何实现路由 RabbitMQ是一个基于AMQP协议实现的分布式消息中间件&#xff0c;AMQP具体的工作机制是生产者将消息发送到RabbitMQ Broker上的Exchange交换机上&#xff0c;Exchange交换机将收到的消息根据路由规则发给绑定的队列&#xff08;Queue&#xff09;&am…

汇总区间(Java)

大家好我是苏麟 , 这篇文章也是凑数的 ... 描述 : 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 n…

C++之特殊类的设计

目录 一、单例模式 1、设计模式 2、单例模式 1、饿汉模式 2、懒汉模式 3、单例对象的释放问题 二、设计一个不能被拷贝的类 三、设计一个只能在堆上创建对象的类 四、设计一个只能在栈上创建对象的类 五、设计一个不能被继承的类 一、单例模式 1、设计模式 概念&am…

二分归并法将两个数组合并

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> main() {int a[5] {1,3,4,5,6};int b[4] {2,7,8,9};int c[9];int m0, n0,k0;while (m < 5 && n < 4){if (a[m] < b[n]){c[k] a[m];//谁小谁先进数组m; k;}else{c[k] b[n];k; n;}}while (m <…

【Java从入门到大牛】特殊文本文件和日志技术

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Java从入门到大牛 &#x1f320; 首发时间&#xff1a;2023年10月27日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f4…

【黑马程序员】mysql进阶篇笔记

2023年10月27日17:50:07 58.01. 进阶-课程介绍(Av765670802,P58) 59.02. 进阶-存储引擎-MySQL体系结构(Av765670802,P59) 60.03. 进阶-存储引擎-简介(Av765670802,P60) 61.04. 进阶-存储引擎-InnoDB介绍(Av765670802,P61) 62.05. 进阶-存储引擎-MyISAM和Memory(Av765670802…

【计算机毕设小程序案例】基于微信小程序的图书馆座位预定系统

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 &#x1f449;IT源码社-SpringBoot优质案例推荐&#x1f448; &#x1f449;IT源码社-小程序优质案例…

Visual Studio Professional 2019 软件安装教程(附安装包下载)

Microsoft Visual Studio 是一个非常强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;适用于 Windows 上的 .NET 和 C 开发人员。它提供了一系列丰富的工具和功能&#xff0c;可以提升和增强软件开发的每个阶段。 Visual Studio IDE 是一个创意启动板&#xff0c;可…

百度文心一言4.0抢先体验教程!

&#x1f341; 展望&#xff1a;关注我, AI学习之旅上&#xff0c;我与您一同成长&#xff01; 一、 引言 想快速体验文心一言4.0&#xff0c;但又觉得技术难度太高&#xff1f;别担心&#xff0c;我来手把手教你&#xff01; &#x1f680; 10月17日&#xff0c;文心一言4.0…

蓝桥杯 Java 括号序列

本算法需要把问题分解成三步&#xff1a; 第一步&#xff1a;算出 ((() 填充 ( 的方案 第二步&#xff1a;算出 ((() 填充 ) 的方案 第三步&#xff1a;把两个方案相乘 第二步可以把原方案当成将 ((() 逆转成 ())) 再填充 ( &#xff0c;这样就可以重复第一步用的算法 第一步…