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

news/2024/7/7 23:01:49

 题目

摆玩具【算法赛】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;
}

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

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

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


http://lihuaxi.xjx100.cn/news/1726697.html

相关文章

67 内网安全-域横向smbwmi明文或hash传递

#知识点1: windows2012以上版本默认关闭wdigest&#xff0c;攻击者无法从内存中获取明文密码windows2012以下版本如安装KB2871997补丁&#xff0c;同样也会导致无法获取明文密码针对以上情况&#xff0c;我们提供了4种方式解决此类问题 1.利用哈希hash传递(pth&#xff0c;ptk等…

计算机毕业设计 基于SpringBoot高校竞赛管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

SEACALL海外呼叫中心系统的优势包括

SEACALL海外呼叫中心系统的优势包括 封卡封号问题解决 海外呼叫中心系统通过API开放平台能力&#xff0c;定制电话营销系统&#xff0c;提供多项功能如自动拨打、智能应答、真人语音交互等&#xff0c;帮助企业克服员工离职率高、客户资源流失严重等挑战。 - 高级管理者操控 …

python cos(x) 精确到某值 esp如0.00001

cos(x) import math def funcos(esp, x):x float(x)c1 float(1)c2 float(0)y 1z 2while(math.fabs(c1) > esp):c2 c1c1 (-1)*c1*x*x/y/zy 2z 2c2 c1print(c2) esp float(input(请输入esp:)) x float(input(请输入x:)) funcos(esp, x)

代码随想录打卡第五十三天|309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 题目&#xff1a; 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 卖…

leetcode_40 组合总数II

1. 题意 找到所有可能的组合数&#xff0c;只是不能重复选择同一元素。 组合总数II 2. 题解 2.1 我的解法 在leetcode39的基础上&#xff0c;再加上一个标记数组即可。 class Solution { public:void gen(vector<vector<int>> &res, vector<int>&a…

配置Super-VLAN下的DHCP服务器示例

组网需求 如图1所示&#xff0c;某公司拥有两个部门&#xff0c;为了节省IP地址&#xff0c;部门A和部门B规划为同一网段&#xff1b;为了提升业务安全性&#xff0c;将不同部门的用户划分到不同VLAN中。企业管理员为了方便统一管理&#xff0c;希望部门内终端通过DHCP服务器动…

Linux编译安装brpc

一、安装brpc依赖项目 &#xff08;1&#xff09;安装 protobuf wget https://github.com/protocolbuffers/protobuf/releases/download/v21.9/protobuf-cpp-3.21.9.tar.gz tar -zxvf protobuf-cpp-3.21.9.tar.gz cd protobuf-3.21.9/ mkdir build && cd build cmake…