贪心思想的初步理解

8 篇文章 0 订阅
6 篇文章 1 订阅

目录

1.分配问题

2.区间问题

3.买股票的最佳时机

4.总结


1.分配问题

题目描述:

这类题目大概就是说这里有一群孩子,还有一堆饼干,每个孩子都很饿,如果饼干大小大于等于这个小孩的饿度,那么这个小孩就可以吃饱(n个小孩,m个饼干),现在让我们输出我们最多能让多少个孩子吃饱。

这里开两个数组,a数组用来存小孩的饿度,b用来存每个饼干的大小。

解题思路就很明显是贪心的思想:我们要想办法先填报饿度最小的孩子,这样一直考虑当前情况最优解,之后得出全局的最优解,这样我们才能够让更多的孩子吃饱。

所以首先我们对a,b两个数组进行排序,接下来用两个变量去移动,如果第一个饼干填不饱第一个小孩的肚子,就让b数组的变量+1,一直往后面推,如果a[i]<=b[j],那么说明可以填饱当前这个小孩的肚子,sum++.

 所以实现的代码如下:

#include<bits/stdc++.h>
const int N=1e5+10;
int a[N],b[N];
using namespace std;
int main() {
	int n,m;
	cin>>n>>m;
	for(int i=0; i<n; i++)
		cin>>a[i];
	for(int i=0; i<m; i++)
		cin>>b[i];
	sort(a,a+n);
	sort(b,b+m);
	long long sum=0;
	for(int i=0,j=0; j<m&&i<n;) {
		if(a[i]<=b[j])
			sum++,i++,j++;
		else
			j++;
	}
	cout<<sum<<endl;
	return 0;
}

2.区间问题

给定多个区间(就是类似于那种时间安排的问题,给定很多段时间,然后参加尽量多的活动),计算让这些区间互不重叠的所需要移除区间的最小个数,起止相连不算重叠。

所以我们这里其实要用到贪心思维,如果这个区间的结束段越小,那么他留给其他端的时间就会越多,那我们就对输入的这些时间段的结束时间进行排序,每次选择结尾小,而且与前面区间不重叠的区间。

自己敲了一小段代码,来解决这个问题,如下:

#include<iostream>
#include<algorithm>
#include<iomanip>
const int N=1e5;
using namespace std;
struct node{
	int s;
	int e;
}t[N];
bool cmp(const node &a,const node &b) {
	return a.e<b.e;
}
int main() {
	int n,ans=0,end;
	cin>>n;
	for(int i=0; i<n; i++)
		cin>>t[i].s>>t[i].e;
	sort(t+0,t+n,cmp);//这里用到了结构体排序;
	end=INT_MIN;//开一个变量来存动态的结束;
	for(int i=0;i<n;i++) {
		if(t[i].s>=end) {
			ans++;
			end=t[i].e;
		}
	}
	cout<<ans<<endl;
	return 0;
}

这里就是用前一个区间的结束首先作为end,之后,如果下一段的起始满足比这个end要大(也就是保证这个区间不会覆盖住),再把它更新成为下一个区间的结束。

3.买股票的最佳时机

题目意思描述:给定一个数组,他的第i个元素是一只股票第i天的价格。设计一个算法来计算你所能获取的最大利润,你可以尽可能地完成更多的交易(多次买卖一只股票)

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

输入:[7,1,5,3,6,4];

输出:7

就是她第二天1块钱买入,第三天5块钱卖出,sum+=5-1;之后第四天买,第五天卖出,sum+=6-3,最后一天再买肯定会亏,所以sum最大就是7块钱。

那么这一题的解题思想就说,只要我今天买了,明天卖出去我不亏那我就买,不然我就不买1,有这样的局部最优解,来推及全局的最优解

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N]; 
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	   cin>>a[i];
	long long p=0;
	for(int i=0;i<n-1;i++)
	{
		if(a[i]<a[i+1])
		p+=a[i+1]-a[i];
	}
	cout<<p<<endl;
 } 

4.总结

如何判断一个题目是否可以使用贪心算法?


1.最优子结构,它可以逐步由局部的最优解,慢慢退,然后可以得出全局的最优解。

2.贪心选择性质,很大的一个特点就是当前选择的方案,对后面做选择没有影响。不像背包问题,背包的容量是固定的,如果我选择了最大的价值的物品,但是他很占空间,这就可能导致我后面的价值中等,重量小的物品放不下的情况

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andy℡。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值