【3.5】贪心算法-解优势洗牌(类田忌赛马问题)

news2024/9/23 13:25:11

一、问题

        给定两个 大小相等的数组 A 和 B ,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。 返回 A 的任意排列,使其相对于 B 的优势最大化。

二、解题思路

        这个问题要求我们重新排列数组A,使得在相同位置上,数组A的元素大于数组B的元素的次数最多,从而最大化数组A相对于数组B的优势。我们可以将数组A视为田忌的马匹,数组B视为齐王的马匹,数组中的数值代表马匹的速度。

        对于任意长度的数组,我们可以采用类似田忌赛马的策略来解决这个问题:

        1. **如果田忌最快的马速度不及齐王最快的马**,那么田忌应该用最慢的马与齐王最快的马比赛。因为齐王最快的马已经超过了田忌最快的马,田忌无论派出哪匹马都会输,所以选择用最慢的马来节省实力。

        2. **如果田忌最快的马速度超过齐王最快的马**,那么田忌应该用最快的马与齐王最快的马比赛。因为田忌最快的马能够赢得这场比赛,所以应该充分利用这匹马的优势。

        这种策略的合理性在于,通过比较田忌和齐王最快的马,我们可以决定是否值得用田忌最快的马去争取胜利。如果田忌最快的马无法胜过齐王最快的马,那么使用最慢的马是明智的选择,因为这样可以保留更强的马匹用于后续的比赛。反之,如果田忌最快的马能够胜过齐王最快的马,那么就应该用它来确保这场比赛的胜利。

        通过这种贪心算法的策略,我们可以在每一步都做出当前最优的选择,从而最大化数组A相对于数组B的优势。

三、代码实现

原理已经了解,我们来看下代码

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

std::vector<int> advantageCount(std::vector<int>& nums1, std::vector<int>& nums2) {
    int length = nums1.size();
    std::vector<int> res(length);
    // 先对数组nums1从小到大进行排序
    std::sort(nums1.begin(), nums1.end());
    // 对数组nums2从大到小排序,这里使用的是优先队列,也就是最大堆,每次出队的都是堆中最大的元素
    // 这里存储的是数组nums2中的元素和元素对应的下标
    std::priority_queue<std::pair<int, int>> pq;
    for (int i = 0; i < length; i++) {
        pq.push({nums2[i], i});
    }
    // 双指针,分别指向数组nums1中的最小值和最大值。可以类比于田忌跑的最慢的马和跑的最快的马
    int left = 0;
    int right = length - 1;
    while (!pq.empty()) {
        // 队列中存放的是数组nums2中的元素,每次出队的都是堆中最大的值,
        // 类比齐王每次都拿出剩下的马中最好的马比赛
        auto cur = pq.top();
        pq.pop();
        int index = cur.second;
        int val = cur.first;
        // 先用nums1中的最大值和nums2中的最大值比较,类似于田忌用最好的马
        // 和齐王最好的马比较,如果田忌最好的马跑的比齐王最好的马跑的快,
        // 就用田忌最好的马和齐王最好的马比赛
        if (nums1[right] > val) {
            res[index] = nums1[right--];
        } else {
            // 如果田忌最好的马没有齐王最好的马跑的快,就用田忌最差的马
            // 和齐王最好的马比赛
            res[index] = nums1[left++];
        }
    }
    return res;
}

int main() {
    std::vector<int> nums1 = {2, 7, 11, 15};
    std::vector<int> nums2 = {1, 10, 4, 11};
    std::vector<int> result = advantageCount(nums1, nums2);
    for (int num : result) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    return 0;
}

 

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

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

相关文章

Ubuntu 24.04部署Wordpress

环境&#xff1a; Ubuntu 24.04 PHP 8.1.2-1ubuntu2.18 Nginx/1.18.0 (Ubuntu) WordPress 6.6.1 Mysql 8 文章目录 1. 安装php2. 配置nginx2.1. 安装nginx2.2. 配置 3. 下载wordpress3.1. 配置wordpress 4. mysql配置wordpress数据库和用户4.1. 安装和远程连接4.2. 创建wordpre…

uart16550_ip_spec

用途&#xff1a;允许与调制解调器或其他外部设备进行通信&#xff0c;例如使用串行电缆和RS232协议的另一台计算机。 核心特性&#xff1a; WISHBONE接口&#xff1a;支持32位或8位数据总线模式&#xff08;可选&#xff09;。 FIFO操作&#xff1a;仅支持FIFO&#xff08;先…

惊爆!布偶猫喂养秘籍:希喂、交响乐金罐、尾巴生活适合布偶猫吗?

我家布偶甜美可爱&#xff0c;喜欢撒娇爱粘人&#xff0c;真的特别可爱。不过想养好布偶猫喂食非常重要&#xff0c;喂食方法不对&#xff0c;食物没选择好&#xff0c;都会影响布偶猫的健康与正常生长。今天我就就拿布偶猫的选粮标准来测评三款热门主食罐&#xff0c;让大家更…

基于JAVA的专利资源共享平台

项目介绍 基于JAVA的专利资源共享平台系统是一个集专利信息展示、资源共享、交易服务等功能于一体的综合性平台。该系统利用JAVA语言的强大功能和广泛的生态系统&#xff0c;结合数据库技术、Web开发技术等&#xff0c;为用户提供了一个高效、安全、便捷的专利资源共享和交易环…

天气分析预测系统-气象网

项目介绍 在信息科技蓬勃发展的当代&#xff0c;我们推出了一款基于Python Flask的全国上海气象数据采集、预测和可视化系统。随着气候变化越发引起全球关注&#xff0c;精准的气象数据和可视化展示变得愈发重要。该系统采用先进的技术和创新的功能&#xff0c;满足用户对实时…

html+css+js网页设计 个人博客模版 我的学习经历7个页面

htmlcssjs网页设计 个人博客模版 我的学习经历7个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取…

npm登录

npm 登录 npm login --auth-typelegacy报错 原因 npm源非npm本身源&#xff0c;需要切换&#xff1a; 查看源 nrm ls切换为npm源 nrm use npm重新登录 输入OTP验证后登录成功&#xff1a;

包含结构体的类的大小

看一下简单的例子&#xff0c;一个类声明中包含了一个结构体的声明&#xff0c;在没有定义这个结构体变量的情况下&#xff1a; #include <stdlib.h> #include <stdio.h> #include <malloc.h>class CTest { public:CTest(){}~CTest() {}struct internal{in…

在AMD GPU上使用DBRX Instruct

DBRX Instruct on AMD GPUs — ROCm Blogs 在这篇博客中&#xff0c;我们展示了DBRX Instruct&#xff0c;这是由Databricks开发的一个专家混合大型语言模型&#xff0c;在支持ROCm的系统和AMD GPU上运行。 关于DBRX Instruct DBRX是一个基于Transformer的仅解码大型语言模型…

OpenCV绘图函数(8)填充凸多边形函数fillConvexPoly()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 填充一个凸多边形。 函数 cv::fillConvexPoly 绘制一个填充的凸多边形。这个函数比 fillPoly 函数快得多。它可以填充的不仅仅是凸多边形&#…

护眼台灯减蓝光和无蓝光的有区别?眼科医生推荐的护眼台灯

自从疫情以后&#xff0c;”网课“成了一个热门的课程&#xff0c;许多家长会为了孩子的学习进行网课的报名。孩子们的眼睛处于生长期比较脆弱&#xff0c;长时间对着手机&#xff0c;电脑上课&#xff0c;电子产品会产生蓝光&#xff0c;眼睛会受到一定的伤害。护眼台灯减蓝光…

CTFHub-SSRF过关攻略(持续更新中...)

第一题&#xff0c;内网访问 一&#xff0c;打开web/ssrf/内网访问 二&#xff0c;进入页面什么都没有查看一下上一步给的参数 三&#xff0c;输入http://127.0.0.1/flag.php回车显示flag 四&#xff0c;然后复制提交&#xff08;恭喜通关&#xff09; 第二题&#xff0c;伪协…

AI智能大数据分析足球AIAutoPrediction,提高足球比赛预测准确度的新方法

本文摘要&#xff1a;一、I智能大数据分析足球的原理I智能大数据分析足球的原理是利用机器学习和大数据分析技术&#xff0c;对足球比赛的各种数据进行分析和预测。这些数据包括球队历史成绩、球员数据、场地... 一、I智能大数据分析足球的原理 I智能大数据分析足球的原理是利…

视频生成类大模型实现原理以及应用和难点

“ 视频生成属于计算机视觉领域&#xff0c;还包括图像处理等 ” 生成式大模型在文本&#xff0c;图像&#xff0c;视频等方面表现良好&#xff0c;而我们都知道文本生成大模型是基于自然语言处理技术&#xff0c;而视频生成的大模型又是怎么实现的呢&#xff1f; 今天我们就…

学习笔记之JS篇(0828)

Error Lens:报错提示插件 2. 主题&#xff08;One Dark Pro) 3. VSCode自带格式化工具代码缩进字符改为2个字符 4. 代码缩进字符改为2个字符 左右分屏&#xff08;live Server) Win 左右箭头 **学 习 ** 不能只看不动手 不管多简单的代码都要练习 随时暂停视频随时写代码 …

Win10 安装 Rabbitmq

参考文档&#xff1a;https://www.rabbitmq.com/docs/install-windows 一、安装 Erlang 语言 安装 RabbitMQ 需要该语言的支持才能安装 下载地址&#xff1a;https://erlang.org/download/otp_versions_tree.html 点击这里下载最新版本&#xff1a;27.0.1 直接默认 next 更…

Django+vue自动化测试平台(29)--测试平台集成playwright录制pytest文件执行

需求背景 一、 系统目标与功能概述 脚本管理: 系统需要能够组织和存储所有通过playwright官方插件录制的脚本。这包括脚本的上传、编辑、删除和版本控制功能。 脚本执行: 用户应该能够在后台界面上查看所有可用的脚本&#xff0c;并能够通过简单的点击操作来启动特定脚本的执…

微调方法概览

前言 大语言模型(LLM)的训练过程通常分为两大阶段&#xff1a; 阶段一&#xff1a;预训练阶段 此阶段模型是在大规模的无标签数据集上接受训练&#xff0c;目标是使模型掌握词汇的含义、句子的构造规则以及文本的基本信息和上下文。 需特别指出&#xff0c;预训练实质上是一…

16002.orin nano平台 linux gpio 学习记录

文章目录 1 查看当前系统gpio配置信息2 orin / nano gpio2.1 GPIO 映射表2.2 nano 平台对外提供的2排端口表 3 配置GPIO 电平3.1 通过指令配置普通GPIO高电平3.2 通过设备树配置普通GPIO高电平3.3 配置特定 gpio 高电平 1 查看当前系统gpio配置信息 sudo cat /sys/kernel/debu…

【日记】已经在开始幻想明年的年度计划了(498 字)

正文 看来每次都是准备迎检的时候忙很多&#xff0c;但检查来的时候反倒还好一点。 今天比昨天好上一些&#xff0c;没有那么忙了。 感觉不去跳舞的 8 月&#xff0c;运动量下降了好多&#xff0c;膝盖经常响。只要半月板没事就好…… 前几天高配速的酸痛好像彻底消失了。今晚想…