贪心算法练习题(最小化战斗力差距、谈判、纪念品分组、分糖果)

目录

一、贪心算法的介绍

二、贪心算法的实现步骤

三、最小化战斗力差距

四、谈判

五、纪念品分组

六、分糖果


一、贪心算法的介绍

贪心的基本原理:每一步都选择局部最优解,而尽量不考虑对后续的影响,最终达到全局最优解。

贪心的局限性:贪心算法不能保证获得全局最优解,但在某些问题上具有高效性。

贪心的特征:贪心选择性质、最优子结构性质(根据我的观察,很多贪心的题目会出现“不同的操作产生的贡献相同”的特征,在此特征下我们每次选择代价最小的)。

贪心的类型多且杂,难以划分,需要不断练习和积累。

二、贪心算法的实现步骤

1.确定问题的最优子结构(贪心往往和排序、优先队列等一起出现)
2.构建贪心选择的策略,可能通过 “分类讨论”、“最小代价”、“最大价值” 等方式来思考贪心策略。简单验证贪心的正确性,采用句式一般是:这样做一定不会使得结果变差、不存在比当前方案更好的方案等等。
3.通过贪心选择逐步求解问题,直到得到最终解。

三、最小化战斗力差距

问题描述

小蓝是机甲战队的队长,他手下共有n名队员,每名队员都有一个战斗力值wi。现在他需要将这 n 名队友分成两组 a和b,分组必须满足以下条件:

每个队友都属于 a 组或b组。

a 组和b组都不为空。

战斗力差距最小。

战斗力差距的计算公式为|max(a)- min(b)|,其中 max(a)表示 a 组中战斗力最大的,min()表示b组中战斗力最小的。 请你计算出可以得到的最小战斗力差距。

 输入格式

第一行一个整数 n,表示队员个数。 第二行 n 个整数 w1, w2, w3......wn,分别表示每名队友的战斗力值。数据范围保证:2 ≤n ≤ 1e5,1 ≤ wi≤ 1e9

输出格式

输出一个整数,表示可以得到的最小战斗力差距 

简单排序模型。
要将战斗力分为两部分,为了使得差距最小,我们可以将战斗力排序后,找一个位置进行划分,使得左边的都在a,右边的都在b,从而这个差距就是这个位置两边的战斗力差距,说明差距的取值仅有n-1种,枚举即可。

#include <bits/stdc++.h>  
using namespace std;const int N = 1e5 + 9;
int a[N];int main()
{int n; cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];sort(a, a + n);int ans = a[2] - a[1];for (int i = 1; i < n; i++)ans = min(ans, (a[i + 1] - a[i]));cout << ans;return 0;
}

四、谈判

总操作数一定情况下的最小代价模型我们知道这里一共需要进行的操作次数一定是n-1次,那么贪心地想,如果每次选择代价最小的两个部落合并,不仅可以使得当前代价最小,还可以使得后续合并的代价也尽可能小。部落大小通过优先队列来维护

#include<bits/stdc++.h>   
using namespace std;     
using ll = long long;
priority_queue<ll, vector<ll>, greater<ll>> pq; 
// 声明一个最小堆(优先队列),元素类型为ll(长整型)  int main() {          int n;cin >> n;            // 循环n次,每次读取一个整数并添加到优先队列中  for(int i = 1; i <= n; ++i) {ll x; cin >> x;        // 从标准输入读取一个整数x,用于存储每次输入的整数  pq.push(x);       // 将x添加到优先队列pq中  }ll ans = 0;             // 定义一个长整型变量ans,用于存储最终的答案  while (pq.size() > 1) { // 当优先队列中还有多于一个元素时  ll x = pq.top();    // 获取队列顶部的元素(最小的元素)  pq.pop();           // 弹出队列顶部的元素  ll y = pq.top();   // 再次获取队列顶部的元素(当前最小的元素)  pq.pop();          // 再次弹出队列顶部的元素  ans += x + y;          // 将x和y相加,并将结果累加到ans上  pq.push(x + y);   // 将x和y的和添加到队列中  }cout << ans << "\n";  return 0;          
}

五、纪念品分组

题目描述

元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为了使参加晚会的同学所获得的纪念品价值相对均衡,乐乐需要将购来的纪念品根据价格进行分组。但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数 w。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。

你的任务是编写一个程序,找出所有分组方案中分组数最少的一种,并输出最少的分组数目。

输入描述

  1. 第1行包括一个整数 w(80 ≤ w ≤ 200),表示每组纪念品价格之和的上限。
  2. 第2行为一个整数 n(1 ≤ n ≤ 30000),表示购来的纪念品的总件数。
  3. 第3 ~ n+2行,每行包含一个正整数pi(5 ≤ pi ≤ w),表示所对应纪念品的价格。

输出描述

输出一个整数,表示最少的分组数目。

#include <bits/stdc++.h>  
using namespace std;  const int N = 1e5 + 9;  
int a[N];  int main() {  int w, n;  cin >> w >> n;  for (int i = 1; i <= n; ++i) {  cin >> a[i];  }  sort(a + 1, a + 1 + n);  int l = 1, r = n, ans = 0;  while (l <= r) {  ans++; // 每进入一次循环,就增加一组  if (a[l] + a[r] <= w) {  l++; // 如果当前左右两个元素之和小于等于w,则左指针向右移动  }  r--; // 无论是否满足条件,右指针都向左移动}  cout << ans << '\n';  return 0;  
}

六、分糖果

最少数目的贪心模型

为了最小化所需的组数,我们应尽可能让每组都装满两件礼物。贪心策略是:每次选取最贵的礼物,并尝试为它配对一个最便宜的礼物,以确保每组的容量得到最大化利用。这样做既高效又实用,因为最贵与最便宜的礼物组合往往能最有效地占满一组的容量。通过这种策略,我们可以实现组数的最小化。

#include <bits/stdc++.h>  
using namespace std;  const int N = 1e6 + 9;  
char s[N];  int main() {  int n, x;  cin >> n >> x;  cin >> s + 1; // 从数组s的第2个位置开始读取字符串  sort(s + 1, s + 1 + n); // 对字符串进行排序  if (s[1] == s[n]) {  // 如果第一个字符和最后一个字符相同  for (int i = 1; i <= n / x + (n % x ? 1 : 0); ++i) {  cout << s[1];  }  } else if (s[1] == s[x]) {  // 如果第一个字符和位置x上的字符相同  for (int i = x; i <= n; ++i) {  cout << s[i];  }  } else {  // 其他情况  cout << s[x];  }  return 0;  
}

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

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

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

相关文章

使用GRU进行天气变化的时间序列预测

本文基于最适合入门的100个深度学习项目的学习记录&#xff0c;同时在Google clolab上面是实现&#xff0c;文末有资源连接 天气变化的时间序列的难点 天气变化的时间序列预测涉及到了一系列复杂的挑战&#xff0c;主要是因为天气系统的高度动态性和非线性特征。以下是几个主…

自定义镜像上传阿里云

目录 前言 一、Alpine简介 二、Alpine 制作jdk镜像 2.1 jdkv2.0版本 2.2 jdkv3.0版本 三、镜像上传阿里云及下载 前言 上篇博主已经讲解过了自定义镜像&#xff0c;跟上篇文章我们继续衍生自定义镜像https://blog.csdn.net/2302_76638140/article/details/136352907 一…

CUDA学习笔记02:测试程序hello world

参考资料 Win10下在VS2019中配置使用CUDA进行加速的C项目 &#xff08;配置.h文件&#xff0c;.dll以及.lib文件等&#xff09;_vs2019 cuda-CSDN博客 配置流程 1. 新建一个一般的项目 2. 项目建好后&#xff0c;在项目里添加.cu测试文件 测试的.cu文件命名为cuda_utils.cu&…

MySQL——性能调优

性能调优&#xff08;重要&#xff09; SQL 优化的目的 减少磁盘 IO&#xff1a;尽可能避免全表扫描、尽量使用索引、尽量使用覆盖索引减少回表操作减少 CPU 和内存的消耗&#xff0c;尽可能减少排序、分组、去重之类的操作&#xff0c;尽量减少事务持有锁的时间 优化途径&…

Material UI 5 学习02-其它按钮组件

Material UI 5 学习02-其它按钮组件 一、IconButton按钮二、 ButtonGroup按钮组1、最基本的实例2、垂直按钮组 一、IconButton按钮 图标按钮通常适用于切换按钮&#xff0c;允许选择或选择单个选项 取消选择&#xff0c;例如在项目中添加或删除星号。 <IconButton aria-lab…

“互动+消费”时代,借助华为云GaussDB重构新零售中消费逻辑

场与人的关系 “人—货—场”是零售中重要的三要素&#xff0c;我们一直在追求&#xff0c;将零售中的人、货、场进行数字化并在云端进行整合&#xff0c;形成属于我们自己的云平台。 随着互联网技术为信息提供的便利&#xff0c;消费者的集体力量正在逐渐形成一股强大的反向…

保姆级GeoWebCache矢量瓦片切片流程

1矢量切片解决方案 1.1Geoserver配置geowebcache插件 参考文章 (53条消息) 独立安装geoservergeowebcache发布arcgis切片服务_itouch_ok的专栏-CSDN博客 1.将下载好的geoserver 2.19.3安装部署 将下载好的geowebcache 2.19.3的war包解压到 GeoServer 安装目录下./usr/loc…

使用Julia语言及R语言进行格拉布斯检验

在日常的计量检测工作中经常会处理各种数据&#xff0c;在处理数据之前会提前使用格拉布斯准则查看数据中是否存在异常值&#xff0c;如果存在异常值的话应该重新进行计量检测&#xff0c;没有异常值则对数据进行下一步操作。判断异常值常用的格拉布斯方法基于数据来自正态分布…

SpringCloud(19)之Skywalking应用上篇

一、Skywalking概述 随着互联网架构的扩张&#xff0c;分布式系统变得日趋复杂&#xff0c;越来越多的组件开始走向分布式化&#xff0c;如微服务、消 息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用&#xff0c;这些组件共同构成了繁杂的分布式网络。 思考以下…

智能驾驶规划控制理论学习06-基于优化的规划方法之数值优化基础

目录 一、优化概念 1、一般优化问题 2、全局最优和局部最优 二、无约束优化 1、无约束优化概述 2、梯度方法 通用框架 线性搜索 回溯搜索 3、梯度下降 基本思想 实现流程 ​4、牛顿法 基本思想 实现流程 5、高斯牛顿法 6、LM法&#xff08;Le…

实践航拍小目标检测,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建无人机航拍场景下的小目标检测识别分析系统

关于无人机相关的场景在我们之前的博文也有一些比较早期的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《deepLabV3Plus实现无人机航拍目标分割识别系统》 《基于目标检测的无人机航拍场景下小目标检测实践》 《助力环保河道水质监测&#xff0c;基于yolov…

高级货,极大提高效率,个人非常喜欢

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; FileConverter中文版是一款免费软件&#xff0c;具有强大的功能。它支持多种文件格式的转换&#xff0c;包括视频、音频、文档等。您可以批量转换文件…

bert 相似度任务训练简单版本,faiss 寻找相似 topk

目录 任务 代码 train.py predit.py faiss 最相似的 topk 数 任务 使用 bert-base-chinese 训练相似度任务&#xff0c;参考&#xff1a;微调BERT模型实现相似性判断 - 知乎 参考他上面代码&#xff0c;他使用的是 BertForNextSentencePrediction 模型&#xff0c;Bert…

Tomcat概念、安装及相关文件介绍

目录 一、web技术 1、C/S架构与B/S架构 1.1 http协议与C/S架构 1.2 http协议与B/S架构 2、前端三大核心技术 2.1 HTML&#xff08;Hypertext Markup Language&#xff09; 2.2 css&#xff08;Cascading Style Sheets&#xff09; 2.3 JavaScript 3、同步和异步 4、…

Node.js与Webpack笔记(一)

这里使用的16.19.0版本&#xff0c;官网和github没找到&#xff0c;去黑马2023年课程里找 篇幅较大会卡&#xff0c;此篇幅不写Webpack部分&#xff0c;留着下一篇 初识 1.什么是Node.js? Node.js 是一个独立的 JavaScript 运行环境&#xff0c;能独立执行 JS 代码&#xff…

【Linux】Linux原生异步IO:AIO

1、IO模型 1.1 简述 相信大家在搜索的时候,都会看到下面这张图,IO的使用场景:同步、异步、阻塞、非阻塞,可以组合成四种情况: 同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可…

向微队列添加任务的四种方式

向微队列添加任务的四种方式 关于微任务&#xff0c;微队列&#xff0c;事件循环&#xff0c;可参考&#xff1a;深入&#xff1a;微任务与 Javascript 运行时环境 - Web API 接口参考 | MDN (mozilla.org) 先说答案, 四种方法&#xff1a; Promise.resolve().then();Mutation…

【Web前端入门学习】——HTML

目录 HTML简介HTML文件结构常用文本标签标题标签段落标签有序列表和无序列表表格标签 HTML属性a标签—超链接标签图片标签 HTML区块块元素与行内元素 HTML表单 HTML简介 HTML全称是Hypertext Markup Language超文本标记语言。 HTML的作用&#xff1a; 为网页提供结构&#xff…

数据库管理-第158期 Oracle Vector DB AI-09(20240304)

数据库管理158期 2024-03-04 数据库管理-第158期 Oracle Vector DB & AI-09&#xff08;20240304&#xff09;1 创建示例表2 添加过滤条件的向量近似查询示例1示例2示例3示例4示例5示例6示例7 总结 数据库管理-第158期 Oracle Vector DB & AI-09&#xff08;20240304&a…

C#插入排序算法

插入排序实现原理 插入排序算法是一种简单、直观的排序算法&#xff0c;其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。 具体实现步骤如下 首先咱们假设数组长度为n&#xff0c;从第二个元素开始&#xff0c;将当前元素存储在临时变量temp中。 从当前元素的前一…