算法篇------贪心1

news2024/11/25 10:33:20

文章目录

    • 贪心的概念
    • 题目1------经典的选择排序(简单)
    • 题目2----平衡字符串(简单)
    • 题目3---买卖股票的最佳时间(中等)
    • 题目4------跳跃游戏(中等)
    • 题目5-------钱币找零
    • 题目6------多机调度的问题

贪心的概念

什么是贪心算法?
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择不从整体
最优上加以考虑
,他所做出的是在某种意义上的局部最优解

举个例子:
你现在非常非常饿, 去食堂买了5,6个菜。每次都优先吃完最好吃的那一份菜,然后算吃完所有的菜。
你的任务:就是吃完所有的菜。 解决问题的方式:优先吃最好吃的。

题目1------经典的选择排序(简单)

为什么说它是一种贪心算法呢?
因为每次都是选择最大值或者最小值以达到排序的目的。

下面代码可以适度优化一下,同时找最小值和最大值,放在数组的两端。
不过要注意的是,交换的时候可能会出现 “位置重叠”
代码:

void SelectSort(int* arr, int n)
{
	for (int i = 0; i < n; i++)
	{
		int maxi = i;
		for (int j = i + 1; j < n; j++)
		{
			if (arr[maxi] < arr[j])
				maxi = j;
		}

		swap(arr[i], arr[maxi]);
	}
}

题目2----平衡字符串(简单)

力扣:平衡字符串
解题思路:优先遇到平衡则计数加1.
为什么是贪心算法呢? 因为只考虑局部,不用考虑整体。
也就是说,我每遇到一对平衡字符串,则计数加1。

代码:

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

            if(balance == 0)
              count++;
        }
        
        return count;
    }
};

题目3—买卖股票的最佳时间(中等)

在这里插入图片描述

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

题目4------跳跃游戏(中等)

力扣:跳跃游戏

为什么跳跃游戏是贪心呢?
因为只用考虑当前下标位置跳跃的最远距离,能不能跳过整个数组。
通过一列当前位置的跳跃来求解总问题。

代码:

class Solution {
public:
    bool canJump(vector<int>& nums) 
    {
        int len = nums.size();
        int maxdis = 0; //定义的下标位置

        for(int i = 0; i < len; i++)
        {
            if(i <= maxdis) // 表示可以到达下标i的位置,如果不能到达就没有必要了
            {
                  maxdis = max(maxdis, i + nums[i]);
            }

            if(maxdis >= len - 1)
               return true;
        }

         return false;
    }
};

题目5-------钱币找零

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

为什么是贪心呢?
每次都找到最大面额的钱,通过一系列局部的最优解来解决总问题

class Sort
{
public:
	bool operator()(vector<int> a, vector<int> b)
	{
		return a[0] > b[0];         //按照二维数组中一维数组第一个元素排升序
	}
};

int get_money_num(const vector<vector<int>>& vv, int money)
{
	int num = 0;	
	for (int i = 0; i < vv.size(); i++)
    {
	   int cnt = min(money / vv[i][0], vv[i][1]);
	   money -= cnt * vv[i][0];
	   num += cnt;

	   if (money == 0)
		   return num;
	}	

	return -1;
}

int main()
{
	vector<vector<int>> vv = { {10,5}, {100,4}, {20, 3} , {5, 6}, {1, 10}, {50,5 } };
	sort(vv.begin(), vv.end(), Sort());  

	int money = 0;
	while (cin >> money)
	{
		int ret = get_money_num(vv, money);

		if (ret == -1)
		{
			cout << "无法找零" << endl;
		}
		else
		{
			cout << ret << endl;
		}
	}

	return 0;
}

题目6------多机调度的问题

某工厂有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的加工时间为ti,任何作业在被处理时不能中
断,也不能进行拆分处理。现厂长请你给他写一个程序:算出n个作业由m台机器加工处理的最短时间
输入
第一行T(1<T<100)表示有T组测试数据。每组测试数据的第一行分别是整数n,m(1<=n<=10000,
1<=m<=100),接下来的一行是n个整数ti(1<=t<=100)。

解题思路:
分两种情况
1, m >= n 取n个作业中执行时间最长的即可
2, m < n 先将 m 个作业分配给m个机器, 然后每次从剩余的作业中找到最长执行时间的
作业,将它分配给m个机器中耗时最小的哪个机器。
例如:

在这里插入图片描述

为什么是贪心呢? 因为每次都需要去找最长时间的作业放到最快执行完的机器中。
通过一系列的局部最优达到总体最优。

代码分享:

//数组v以按降序排列
int get_min_time(vector<int>& v, int n, int m)
{
	if (n <= m)
	{
		return v[0];
	}

	vector<int> ans( v.begin(), v.begin() + m);

	for (int i = m; i < v.size(); i++)
	{
		int minindex = 0;  //每次找到耗费时间最少的哪个机器下标
		for (int j = 1; j < m; j++)
		{
			if (ans[j] < ans[minindex])
				minindex = j;
		}

		ans[minindex] += v[i];
	}

	int max = ans[0];
	for (int i = 1; i < m; i++)
	{
		if (ans[i] > max)
			max = ans[i];
	}

	return max;
}

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

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

相关文章

ATF源码篇(九):docs文件夹-Components组件(8)固件升级

固件更新&#xff08;FWU&#xff09; 本文档描述了TF-A中可用的各种固件更新&#xff08;FWU&#xff09;机制的设计。 1、PSA固件更新&#xff08;PSA FWU&#xff09;-平台安全架构2、TBBR固件更新&#xff08;TBBR FWU&#xff09;-可信板引导要求 PSA固件更新实施了同名…

[附源码]java毕业设计课程作业管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

vtk拾取器-vtkAbstractPicker/vtkCellPicker

创建了VTK社区&#xff0c;欢迎大家加入雪易社区-CSDN社区云 简介&#xff1a;此文主要介绍vtk中的拾取器的用法&#xff0c;若能为各位小伙伴解决一些困扰就更好了。非常欢迎各位小伙伴指正并补充。 1. vtkAbstractPicker vtkAbstractPicker是vtk拾取器的基类&#xff0c;为…

2022下半年《软考-系统架构设计师》备考经验分享

前言 我参加了2022年11月份的《软考-系统架构设计师》考试&#xff0c;在一个多月的备考之中我总结了一些学习经验和答题技巧&#xff0c;现毫无保留的分享给大家&#xff0c;希望对报考的同学们有所帮助。彩蛋&#xff1a;关注我的公众号【劼哥舍】&#xff0c;回复“软考”即…

dubbo:docker安装dubbo-admin

0.引言 我们在搭建dubbo框架时&#xff0c;需要安装一个dubbo-admin来管理服务已经配置文件&#xff0c;今天我们来看看如何通过docker快速搭建一个dobbo-admin 1. 安装 1、首先到dockerhub上搜索dubbo-admin的镜像源 2、可以看到两个引用较高的镜像源&#xff0c;第一个是a…

SpringCloud和SpringBoot在调Feign传文件时的异常汇总及解决办法

主要记录SpringCloud在调Feign传文件时的问题&#xff1a; 1.&#xff08;按注意点2改正即可&#xff09; Current request is not a multipart request&#xff08;按注意点2改正即可&#xff09; 2.&#xff08;按注意点3处理即可&#xff09; The field files exceeds it…

Pytorch框架基础

目录 1-02张量的简介与创建 pytorch中的Tensor 张量的创建 1-03张量的操作 1. 拼接 2.张量的拼接与切分 3.张量索引 4.张量变换 1-02张量的简介与创建 张量是一个 &#xff0c;它是标量&#xff0c;向量&#xff0c;矩阵的高维拓展 pytorch中的Tensor 在pytorch中的属…

【C++】C++基础知识(七)---指针

C基础知识&#xff08;七&#xff09;1. 指针的定义与使用2. 指针的内存3. 空指针和野指针4. const修饰指针5. 指针与数组6. 指针与函数7. 指针用于数组和函数的案例1. 指针的定义与使用 指针的作用&#xff1a; ------通过指针可以直接的访问变量的内存&#xff0c;内存编号一…

企业在线培训场景下讲师+ppt课件直播应用效果

阿酷TONY / 原创 / 2022-11-17 / 长沙 企业在线培训场景下讲师ppt课件直播应用效果 &#xff1a; 图 / 直播示意图 设备需求&#xff1a; 1. 现场布摄像头&#xff0c;用于采集讲师摄像头视频和音频数据&#xff1b; 2. PC电脑或笔记本电脑一台&#xff08; 安装直播客户端&…

学会Python开发的第一步:写一个桌面小程序

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 当使用桌面应用程序的时候&#xff0c;有没有那么一瞬间&#xff0c; 想学习一下桌面应用程序开发&#xff1f; 建议此次课程大家稍作了解不要浪费太多时间&#xff0c; 因为没有哪家公司会招聘…

科普系列:AUTOSAR与OSEK网络管理比较(下)

在上篇中我们分别在状态机和报文格式方面对OSEK和AUTOSAR网络管理进行了简单介绍&#xff0c;感兴趣的小伙伴请移步至文章《科普系列&#xff1a;AUTOSAR与OSEK网络管理比较&#xff08;上&#xff09;》。 三、OSEK与AUTOSAR网络管理特点对比 本篇就是本文的重点了&#xff…

华为机试 - 区间交集

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 给定一组闭区间&#xff0c;其中部分区间存在交集。 任意两个给定区间的交集&#xff0c;称为公共区间(如:[1,2],[2,3]的公共区间为[2,2]&#xff0c;[3,5],[3,6]的公共区间为[3,5])。 公共区间之间…

Springboot普通类获取运行时环境,获取运行时容器,获取Bean,等等获取运行时一切参数总结大全

文章目录获取ApplicationContextApplicationContext有什么用获取ApplicationContext使用ApplicationContext获取EnvironmentEnvironment有什么用获取Environment使用Environment获取ApplicationContext ApplicationContext有什么用 ApplicationContext为应用程序提供配置的中…

供应点击化学PEG试剂Azide-PEG-Rhodamine B,叠氮聚乙二醇罗丹明

点击化学PEG试剂——叠氮-聚乙二醇-罗丹明&#xff0c;化学试剂其英文名为Azide-PEG-Rhodamine B&#xff0c;N3-PEG-RB&#xff0c;它所属分类为Azide PEG Fluorescent PEG。 peg试剂的分子量均可定制&#xff0c;有&#xff1a;5000、2000、1000、3400、10000、20000 。该试…

java计算机毕业设计ssm气象百事通系统-天气预报系统

项目介绍 本气象百事通系统是针对目前仓库的实际需求,从实际工作出发,对过去的天气系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结构、概念、模型、原…

Matlab:设置日期和时间显示格式

Matlab&#xff1a;设置日期和时间显示格式单个日期和持续时间数组的格式datetime 显示格式duration 显示格式calendarDuration 显示格式默认 格式datetime单个日期和持续时间数组的格式 datetime、duration 和 calendarDuration 数组有一个 Format 属性&#xff0c;可控制每个…

【java篇】你真的了解“基本数据类型”吗?

目录 基本介绍&#xff1a; 整数类型 浮点类型 布尔类型和char类型 自动类型转换 数据类型转换必须满足如下规则&#xff1a; 基本介绍&#xff1a; Java是一门强类型语言&#xff0c;这就意味着必须为每一个变量声明一种类型。Java为我们提供了八种基本类…

基于Qlearning强化学习的机器人路线规划仿真

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 假设我们的行为准则已经学习好了, 现在我们处于状态s1, 我在写作业, 我有两个行为 a1, a2, 分别是看电视和写作业, 根据我的经验, 在这种 s1 状态下, a2 写作业 带来的潜在奖励要比 a1 看…

C++ Reference: Standard C++ Library reference: Containers: deque: deque: assign

C官网参考链接&#xff1a;https://cplusplus.com/reference/deque/deque/assign/ 公有成员函数 <deque> std::deque::assign C98 范围 (1) template <class InputIterator> void assign (InputIterator first, InputIterator last); 填充 (2) void ass…

用户体验成为继MAU后,手机银行竞争分化的下一分水岭,易观千帆重磅发布手机银行APP用户体验GX评测

作为银行金融服务线上场景渗透的有效抓手&#xff0c;当前手机银行APP已经成为其触达用户的重要渠道。随着银行发力场景服务平台成为发展趋势&#xff0c;5G技术问世对金融服务场景端提出新要求&#xff0c;用户体验反馈成为银行线上场景化运营的重要一环。 手机银行APP作为银…