当前位置:   article > 正文

贪心思想的初步理解_贪心思维

贪心思维

目录

1.分配问题

2.区间问题

3.买股票的最佳时机

4.总结


1.分配问题

题目描述:

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

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

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

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

 所以实现的代码如下:

  1. #include<bits/stdc++.h>
  2. const int N=1e5+10;
  3. int a[N],b[N];
  4. using namespace std;
  5. int main() {
  6. int n,m;
  7. cin>>n>>m;
  8. for(int i=0; i<n; i++)
  9. cin>>a[i];
  10. for(int i=0; i<m; i++)
  11. cin>>b[i];
  12. sort(a,a+n);
  13. sort(b,b+m);
  14. long long sum=0;
  15. for(int i=0,j=0; j<m&&i<n;) {
  16. if(a[i]<=b[j])
  17. sum++,i++,j++;
  18. else
  19. j++;
  20. }
  21. cout<<sum<<endl;
  22. return 0;
  23. }

2.区间问题

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

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

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

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<iomanip>
  4. const int N=1e5;
  5. using namespace std;
  6. struct node{
  7. int s;
  8. int e;
  9. }t[N];
  10. bool cmp(const node &a,const node &b) {
  11. return a.e<b.e;
  12. }
  13. int main() {
  14. int n,ans=0,end;
  15. cin>>n;
  16. for(int i=0; i<n; i++)
  17. cin>>t[i].s>>t[i].e;
  18. sort(t+0,t+n,cmp);//这里用到了结构体排序;
  19. end=INT_MIN;//开一个变量来存动态的结束;
  20. for(int i=0;i<n;i++) {
  21. if(t[i].s>=end) {
  22. ans++;
  23. end=t[i].e;
  24. }
  25. }
  26. cout<<ans<<endl;
  27. return 0;
  28. }

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

3.买股票的最佳时机

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

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

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

输出:7

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

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

代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+10;
  4. int a[N];
  5. int main()
  6. {
  7. int n;
  8. cin>>n;
  9. for(int i=0;i<n;i++)
  10. cin>>a[i];
  11. long long p=0;
  12. for(int i=0;i<n-1;i++)
  13. {
  14. if(a[i]<a[i+1])
  15. p+=a[i+1]-a[i];
  16. }
  17. cout<<p<<endl;
  18. }

4.总结

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


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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/846968
推荐阅读
相关标签
  

闽ICP备14008679号