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

news2024/9/23 21:30:48

目录

一、贪心算法的介绍

二、贪心算法的实现步骤

三、最小化战斗力差距

四、谈判

五、纪念品分组

六、分糖果


一、贪心算法的介绍

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

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

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

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

二、贪心算法的实现步骤

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.coloradmin.cn/o/1490248.html

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

相关文章

深度学习-Pytorch实现经典AlexNet网络:山高我为峰

深度学习-Pytorch实现经典AlexNet网络之山高我为峰 深度学习中&#xff0c;经典网络引领一波又一波的技术革命&#xff0c;从LetNet到当前最火的GPT所用的Transformer&#xff0c;它们把AI技术不断推向高潮。2012年AlexNet大放异彩&#xff0c;它把深度学习技术引领第一个高峰…

智慧楼宇的心脏:E6000物联网主机

智慧楼宇是指通过全面覆盖的感知设备和互联网技术&#xff0c;为建筑提供高效、舒适、安全、环保、可持续的智能化服务。 在科技快速发展的今天&#xff0c;智慧楼宇已经不再是遥不可及的梦想。而在这个梦想成真的过程中&#xff0c;物联网主机扮演着至关重要的角色。它如同智慧…

JS逆向进阶篇【去哪儿旅行登录】【下篇-逆向Bella参数JS加密逻辑Python生成】

目录&#xff1a; 每篇前言&#xff1a;引子——本篇目的1、 代码混淆和还原&#xff08;1&#xff09;单独替换&#xff1a;&#xff08;2&#xff09;整个js文件替换&#xff1a; 2、算法入口分析3、 深入分析&#xff08;0&#xff09;整体分析&#xff1a;&#xff08;1&am…

软件应用,财务收支系统试用版操作教程,佳易王记录账单的软件系统

软件应用&#xff0c;财务收支系统试用版操作教程&#xff0c;佳易王记录账单的软件系统 一、前言 以下软件操作教程以 佳易王账单记账统计管理系统V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 如上图&#xff0c;统计报表包含 收支汇…

StarRocks实战——松果出行实时数仓实践

目录 一、背景 二、松果出行实时OLAP的演进 2.1 实时数仓1.0的架构 2.2 实时数仓2.0的架构 2.3 实时数仓3.0的架构 三、StarRocks 的引入 四、StarRocks在松果出行的应用 4.1 在订单业务中的应用 4.2 在车辆方向的应用 4.3 StarRocks “极速统一” 落地 4.4 StarRoc…

Day25-进程管理核心知识1

Day25-进程管理核心知识1 1. CentOS7 软件包安装方式1.1 什么是源码包&#xff1f;1.2 为什么要源码包安装1.3 源码包如何获取1.4 编译安装源码包软件 2. 源码编译示例 下面通过编译Nginx来深入了解下源码包编译的过程。3. Linux 系统进程介绍3.1 什么是进程?3.2 进程/守护进程…

【深度学习】脑部MRI图像分割

案例4&#xff1a;脑部MRI图像分割 相关知识点&#xff1a;语义分割、医学图像处理&#xff08;skimage, medpy&#xff09;、可视化&#xff08;matplotlib&#xff09; 1 任务目标 1.1 任务简介 本次案例将使用深度学习技术来完成脑部MRI(磁共振)图像分割任务&#xff0c…

【MySQL高级篇】06-MySQL架构篇

第01章:Linux下MySQL的安装与使用 1.1 安装前说明 1.1.1 Linux系统及工具的准备 1.1.2 查看是否安装过MySQL 1.1.3 MySQL的卸载 systemctl status mysqld.service #查看mysql服务启停状态 Windows下my.ini文件&#xff0c;在linux下对应为my.cnf 1.2 MySQL的Linux版安…

Docker的安装及MySQL的部署(CentOS版)

目录 1 前言 2 Docker安装步骤 2.1 卸载可能存在的旧版Docker 2.2 配置Docker的yum库 2.2.1 安装yum工具 2.2.2 配置Docker的yum源 2.3 安装Docker 2.4 启动和校验 2.5 配置镜像加速(使用阿里云) 2.5.1 进入控制台 2.5.2 进入容器镜像服务 2.5.3 获取指令并粘贴到…

【go从入门到精通】go环境安装和第一个经典程序

go下载和环境变量配置 下载地址 Go官网下载地址&#xff1a;https://golang.org/dl/All releases - The Go Programming Languagehttps://golang.org/dl/ 然后根据自己的系统环境来选择不同的安装包下载&#xff0c;下面我分别针对不同环境进行说明&#xff08;大家可以根据自…

【古剑杯】

[古剑山]unse方法一 考点&#xff1a;php反序列化、php伪协议 解题步骤&#xff1a; 打开题目界面 直接访问当前目录的test.php&#xff0c;没有返回结果&#xff0c;看到include函数&#xff0c;可以结合php伪协议读取出test.php的源码 解密后 <?php $test "…

1.2计算机体系结构与存储系统

1.计算机体系结构 计算机体系结构简单看看即可&#xff1b; CISC&#xff08;复杂指令集计算机&#xff09;和RISC&#xff08;精简指令集计算机&#xff09; 2.流水线技术 串行效率低&#xff0c;所以用到流水线技术&#xff0c;可以大大缩短执行时间&#xff1b; △t1、△…

docker-compose启动postgres数据库,实现主从备份

文章目录 1. 主库2. 从库3. 测试 1. 主库 创建pg-m 目录&#xff0c;并进入该目录创建docker-compose.yml文件&#xff0c;内容如下&#xff1a; version: "3.1" services:pg_master:image: postgres:15.3container_name: pg_masterenvironment:POSTGRES_PASSWORD:…

景区公园一体化设备怎么选

景区公园一体化设备的选型是一个关键的决策&#xff0c;直接影响着景区公园的整体运营效益和游客体验质量。在选择设备时&#xff0c;需要考虑多个因素&#xff0c;包括设备功能、可靠性、易用性、美观性以及与景区公园整体风格的匹配性等。 首先&#xff0c;在选择设备时要确保…

VScode+Live Service+Five Service实现php实时调试

VScodeLive ServiceFive Service实现php实时调试 一、VScode插件安装及配置 1.Code Runner settings.json设置&#xff08;打开方式&#xff1a;ctrlp&#xff0c;搜索settings.json&#xff09; 设置php为绝对路径&#xff08;注意路径分隔符为\\或/&#xff09; 2. Live S…

0101二阶与三阶行列式-行列式-线性代数

一 引例 求解二元一次方程组 { a 11 x 1 a 12 x 2 b 1 a 21 x 1 a 22 x 2 b 2 \begin{cases} a_{11}x_1a_{12}x_2b_1\\ a_{21}x_1a_{22}x_2b_2\\ \end{cases} {a11​x1​a12​x2​b1​a21​x1​a22​x2​b2​​ 解&#xff1a; 1 a 21 − 2 a 11 ⇒ x 2 a 11 b 2 − a…

苹果因在iOS音乐流媒体市场上的反向引导行为,在欧盟被罚款18.4亿欧元

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

cache基础

set index 是 cache line 在 way 中的序号。set index 通常直接简称为 index 。如果一个物理地址确定&#xff0c;那么其 index 就确定了&#xff0c;这个地址对应的数据缓存在哪个 set 中也就确定了。如上图所示&#xff0c; 物理地址的 bits[y-1:x] 决定了数据缓存在哪个set中…

【FastChat】用于训练、服务和评估大型语言模型的开放平台

FastChat 用于训练、服务和评估大型语言模型的开放平台。发布 Vicuna 和 Chatbot Arena 的存储库。 隆重推出 Vicuna&#xff0c;一款令人印象深刻的开源聊天机器人 GPT-4&#xff01; &#x1f680; 根据 GPT-4 的评估&#xff0c;Vicuna 达到了 ChatGPT/Bard 90%* 的质量&…

红帆OA 多处 SQL注入漏洞复现

0x01 产品简介 红帆iOffice.net从最早满足医院行政办公需求(传统OA),到目前融合了卫生主管部门的管理规范和众多行业特色应用,是目前唯一定位于解决医院综合业务管理的软件,是最符合医院行业特点的医院综合业务管理平台,是成功案例最多的医院综合业务管理软件。 0x02 漏…