我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++贪心算法怎么应用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++贪心算法怎么应用

今天小编给大家分享一下C++贪心算法怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

选择排序

我们熟知的选择排序,其采用的就是贪心策略。 它所采用的贪心策略即为每次从未排序的数据中选取最小值,并把最小值放在未排序数据的起始位置,直到未排序的数据为0,则结束排序。

void swap(int* arr, int i, int j){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}void selectSort(int* arr, int n){//降序for (int i = 0; i < n; i++){int maxIndex = i;for (int j = i+1; j < n; j++){if (arr[j] >= arr[maxIndex])maxIndex = j;}swap(arr, i, maxIndex);}}

平衡字符串

问题描述:

在一个 平衡字符串 中,‘L' 和 ‘R' 字符的数量是相同的。

给你一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。

注意:分割得到的每个字符串都必须是平衡字符串,且分割得到的平衡字符串是原平衡字符串的连续子串。

返回可以通过分割得到的平衡字符串的 最大数量 。

贪心策略:从左往右扫描,只要达到平衡,就立即分割,不要有嵌套的平衡。

故可以定义一个变量balance,在遇到不同的字符时,向不同的方向变化,当balance为0时达到平衡,分割数更新。

比如:从左往右扫描字符串s,遇到L,balance-1,遇到R,balance+1.当balance为0时,更新cnt++ 如果最终cnt==0,说明s只需要保持原样,返回1

代码实现:

class Solution {public:    int balancedStringSplit(string s) {        if(s.size() == 1)            return 0;        int cnt = 0;        int balance = 0;        for(int i = 0; i < s.size(); i++)        {            if(s[i] == 'R')                --balance;            else                 ++balance;            if(balance == 0)                cnt++;        }        if(cnt == 0)            return 1;        return cnt;    }};

买股票的最佳时机

问题描述:

给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

贪心策略:

连续上涨交易日:第一天买最后一天卖收益最大,等价于每天都买卖。

连续下降交易日:不买卖收益最大,即不会亏钱。

故可以遍历整个股票交易日价格列表,在所有上涨交易日都买卖(赚到所有利润),所有下降交易日都不买卖(永不亏钱)

C++贪心算法怎么应用

例如从10到50是连续上涨的5天,可以第一天买入,最后一天卖出,利润为40,等价于第一天买入第二天卖出,第二天再买入。。。以此类推

代码实现:

class Solution {public:    int maxProfit(vector<int>& prices) {        int profit = 0;        for(int i = 0; i < prices.size() - 1; i++)        {            if(prices[i] <= prices[i+1])                profit += prices[i+1] - prices[i];        }        return profit;    }};

跳跃游戏

问题描述:

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

贪心策略:

根据题目描述,对于数组中的任意一个位置y,只要存在一个位置x,它本身可以到达,并且它跳跃的最大长度为x+nums[x],这个值大于等于y,即x+nums[x] >= y,那么位置y也可以到达。即对于每一个可以到达的位置x,它使得x+1,x+2,…,x+nums[x] >= y,那么位置y也可以到达。 一次遍历数组中的每一个位置,并实时更新最远可以到达的位置。对于当前遍历到的位置x,如果它在最远可以到达的位置范围内,那么我们就可以从起点通过若干次跳跃达到该位置,因此我们可以用x+nums[x]更新最远可以到达的位置。

在遍历的过程中,如果最远可以到达的位置大于等于数组中的最后一个位置,那就说明最后一个位置可到达,直接返回true。遍历结束后,最后一个位置仍不可达,返回false。

例如:[2, 3, 1, 1, 4]

一开始在位置0,可跳跃的最大长度为2,因此最远可以到达的位置倍更新为2;继续遍历到位置1,由于1<=2,因此位置1可达。用1加上它最大可跳跃的长度3,将最远可以到达的位置更新为4,4大于最后一个位置4,返回true

代码实现:

class Solution {public:    bool canJump(vector<int>& nums) {        int maxLen = nums[0];        for(int i = 0; i < nums.size(); i++)        {            if(i <= maxLen)            {                maxLen = max(i + nums[i],maxLen);                if(maxLen >= nums.size() - 1)                    return true;            }        }        return false;    }};

钱币找零

问题描述:

假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?

贪心策略: 显然,每一步尽可能用面值大的纸币即可。在日常生活中我们也是这么做的。

代码实现:

//按面值降序struct cmp {bool operator()(vector<int>& a1, vector<int>& a2) {return a1[0] > a2[0];}};int solve(vector<vector<int>>& moneyCount, int money){int num = 0;sort(moneyCount.begin(), moneyCount.end(), cmp());//首先选择最大面值的纸币for (int i = 0; i < moneyCount.size() - 1; i++){//选择需要的当前面值和该面值有的数量中的较小值int c = min(money / moneyCount[i][0], moneyCount[i][1]);money -= c * moneyCount[i][0];num += c;}if (money > 0)num = -1;return num;}

多机调度问题

问题描述:

某工厂有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的加工时间为ti,任何作业在被处理时不能中断,也不能进行拆分处理。现厂长请你给他写一个程序:算出n个作业由m台机器加工处理的最短时间。

输入:第一行T(1<T<100)表示有T组测试数据。每组测试数据的第一行分别是整数n,m(1<=n<=10000,1<=m<=100),接下来的一行是n个整数ti(1<=t<=100)。

输出:所需的最短时间

贪心策略:

这个问题还没有最优解,但是用贪心选择策略可设计出较好的近似算法(求次优解) 当n<=m时,只要将作业分给每一个机器即可;当n>m时,首先将n个作业时间从大到小排序,然后依此顺序将作业分配给下一个作业马上结束的处理机。也就是说从剩下的作业中选择需要处理时间最长的,然后依次选择处理时间次长的,直到所有作业全部处理完毕,或者机器不能再处理其他作业为止。如果我们每次是将需要处理时间最短的作业分配给空闲的机器,那么可能就会储秀安其它所有作业都处理完了只剩下所需时间最长的作业在处理的情况,这样势必效率较低。

C++贪心算法怎么应用

代码实现:

struct cmp{bool operator()(const int& x, const int& y){return x > y;}};int findMax(vector<int>& machines){int ret = 0;for (int i = 0; i < machines.size(); i++){if (machines[i] > machines[ret])ret = i;}return machines[ret];}int greedStrategy(vector<int>& works, vector<int>& machines){//降序sort(works.begin(), works.end(), cmp());int n = works.size();int m = machines.size();for (int i = 0; i < n; i++){int finish = 0;int machineTime = machines[finish];for (int j = 1; j < m; j++){if (machines[j] < machines[finish]){finish = j;}}machines[finish] += works[i];}return findMax(machines);}

活动选择

问题描述:

有n个需要在同一天使用同一个教室的活动a1, a2, …, an,教室同一时刻只能由一个活动使用。每个活动a[i]都有一个开始时间s[i]和结束时间f[i]。一旦被选择后,活动a[i]就占据半开时间区间[s[i],f[i])。如果[s[i],f[i])和[s[j],f[j])互不重叠,a[i]和a[j]两个活动就可以被安排在这一天。求使得尽量多的活动能不冲突的举行的最大数量。

贪心策略:

每次都选择开始时间最早的活动,不能得到最优解。

C++贪心算法怎么应用

每次都选择持续时间最短的活动,不能得到最优解。

C++贪心算法怎么应用

每次选取结束时间最早的活动(结束时间最早意味着开始时间也早),可以得到最优解。按这种方法选择,可以为未安排的活动留下尽可能多的时间。如下图的活动集合S,其中各项活动按照结束时间单调递增排序。

C++贪心算法怎么应用

代码实现:

struct cmp{bool operator()(vector<int>& s1, vector<int>& s2){return s1[1] < s2[1];}};int getMaxNum(vector<vector<int>>& events){sort(events.begin(), events.end(), cmp());int num = 1;int i = 0;for (int j = 1; j < events.size();j++){if (events[j][0] >= events[i][1]){++num;i = j;}}return num;}

无重叠区间

问题描述:

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意:

可以认为区间的终点总是大于它的起点。

区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

贪心策略:

法一:与上题活动选择类似,用总区间数减去最大可同时进行的区间数即为结果。

法二: 当按照起点先后顺序考虑区间时,利用一个prev指针追踪刚刚添加到最终列表中的区间。遍历时,可能遇到三种情况:

情况1:当前考虑的两个区间不重叠。这种情况下不移除任何区间,将prev赋值为后面的区间,移除区间数量不变。

C++贪心算法怎么应用

情况2:两个区间重叠,后一个区间的终点在前一个区间的终点之前。由于后一个区间的长度更小,可以留下更多空间,容纳更多区间,将prev更新为当前区间,移除区间的数量+1

C++贪心算法怎么应用

情况3:两个区间重叠,后一个区间的终点在前一个区间的终点之后。直接移除后一个区间,留下更多空间。因此,prev不变,移除区间的数量+1

C++贪心算法怎么应用

代码实现: 法一:

struct cmp{bool operator()(vector<int>& s1, vector<int>& s2){return s1[1] < s2[1];}};class Solution {public:    int eraseOverlapIntervals(vector<vector<int>>& intervals) {        sort(intervals.begin(), intervals.end(), cmp());        int num = 1;        int i = 0;        for(int j = 1; j < intervals.size(); j++)        {            if(intervals[j][0] >= intervals[i][1])            {                i = j;                num++;            }        }        return intervals.size() - num;    }};

法二:

struct cmp{bool operator()(vector<int>& s1, vector<int>& s2){return s1[1] < s2[1];}};class Solution {public:    int eraseOverlapIntervals(vector<vector<int>>& intervals) {        if(intervals.empty())            return 0;        sort(intervals.begin(), intervals.end(), cmp());        int prev = 0;        int num = 0;        for(int i = 1; i < intervals.size(); i++)        {            //情况1 不冲突            if(intervals[i][0] >= intervals[prev][1])            {                prev = i;            }            else            {                if(intervals[i][1] < intervals[prev][1])                {                    //情况2                    prev = i;                }                num++;            }        }        return num;    }};

以上就是“C++贪心算法怎么应用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++贪心算法怎么应用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++贪心算法怎么应用

今天小编给大家分享一下C++贪心算法怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。选择排序我们熟知的选择排序,其采用
2023-06-29

怎么使用Python贪心算法

这篇文章主要介绍“怎么使用Python贪心算法”,在日常操作中,相信很多人在怎么使用Python贪心算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Python贪心算法”的疑惑有所帮助!接下来,请跟
2023-06-16

贪心算法是什么

本篇文章给大家分享的是有关贪心算法是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1 概念贪心的意思在于在作出选择时,每次都要选择对自身最为有利的结果,保证自身利益的最大化
2023-06-19

怎么使用Python贪心算法解决集合覆盖问题

本文小编为大家详细介绍“怎么使用Python贪心算法解决集合覆盖问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Python贪心算法解决集合覆盖问题”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在《算
2023-06-04

Java中使用贪心算法的示例分析

小编给大家分享一下Java中使用贪心算法的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!贪心算法由于贪心算法本身的特殊性,我们在使用贪心算法之前必须要进行证明,保证算法满足贪心选择性质。具体的证明方法无外乎就是通过
2023-06-15

Java的贪心和枚举怎么使用

今天小编给大家分享一下Java的贪心和枚举怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。笔试技巧:学会根据数据范围猜
2023-06-29

c语言移位算法怎么应用

C语言的移位算法主要用于对二进制数据进行移位操作。移位操作分为左移和右移两种。1. 左移操作(示例:```cint a = 5; // 二进制表示为 0000 0101int b = a ```2. 右移操作(>>):将一个数向右移动指定
2023-09-21

c语言递归算法怎么应用

C语言递归算法可以应用于解决各种问题,特别是涉及到递归结构的问题。以下是一些常见的应用场景:1. 数学问题:计算阶乘、斐波那契数列、幂等计算等。2. 数据结构问题:树的遍历、图的遍历、链表的逆序等。3. 字符串处理问题:字符串反转、回文判断
2023-10-07

C#运算符怎么应用

这篇文章主要讲解了“C#运算符怎么应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#运算符怎么应用”吧!点运算符用于成员访问。name1 . name2C# 操作符之 . 运算符的应用实
2023-06-17

怎么用C++实现贪吃蛇游戏

这篇文章给大家分享的是有关怎么用C++实现贪吃蛇游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1976年,Gremlin平台推出了一款经典街机游戏Blockade。游戏中,两名玩家分别控制一个角色在屏幕上移动
2023-06-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录