贪心算法的思想就是用局部的最优解,达到最后全局的最优解。贪心算法使用是有限制的,一个问题能不能使用贪心来做,往往我们要对其进行必要的证明。贪心算法策略具有无后向性,也就是当前阶段的状态确定之后,不受后面阶段状态的影响。

现在我们先将一个能使用贪心算法的问题——数列极差。

问题描述:在黑板上写了N个正整数作成的一个数列,进行如下操作:每一次擦去其中的两个数a和b,然后在数列中加入一个数a*b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的max,最小的为min,则该数列的极差定义为M=max-min。

思路分析:例如数列2,4,6.按照极差的定义,我们算算这个数列的极差。他有三种情况:(2*4+1)*6+1=55,(4*6+1)*2+1=51,(6*2+1)*4+1=53.我们发现当先算两个较小的数是,得到的是最大值,当先算两个较大的数时,得到的是最小值。因此,我们按照这个思路来解决这个问题。这个问题是求最小值和最大值,然后它们相减,因此我们需要将输入数组逆序的拷贝。至于为啥是逆序的,代码中解释。当我们求出最大和最小的两个数之后,我们记录他们的位置。但是,之后,这两个数将不能用了,因此我们用算出的那个值覆盖他们。

// 贪心法.cpp : 定义控制台应用程序的入口点。
//vs2010
//绝对贪心
#include "stdafx.h"
int s1,s2;
void min2(int a[],int n)
{int j;if (a[0]>a[1]){s1=0;//s1指向最大的数s2=1;} else{s1=1;s2=0;}for(j=2;j<=n;j++){if (a[j]>a[s1]){s2=s1;s1=j;;} else if (a[j]>a[s2]){s2=j;}}
}
int caluatemin(int a[],int n){while(n>1){min2(a,n);a[s1]=a[s1]*a[s2]+1;a[s2]=a[n];n--;}return (a[0]*a[1]+1);
}
//
void max2(int a[],int n)
{
<span style="white-space:pre">  </span>//b数组逆序,在这里是为了计算最大值的时候方便点。计算最大值和计算最小值使用的是同一种方法。int j2=0;if (a[n]<a[n-1]){s1=n;//s1指向最小
     s2=n-1;} else{s1=n-1;s2=n;}for (j2=n-2;j2>=0;j2--){if (a[j2]<a[s1]){s2=s1;s1=j2;} else if(a[j2]<a[s2]){s2=j2;}}}
int calculatemax(int a[],int n)
{while(n>1){max2(a,n);a[s1]=a[s1]*a[s2]+1;a[s2]=a[n];n--;}return (a[0]*a[1]+1);
}
int _tmain(int argc, _TCHAR* argv[])
{//数列极值int a[]={1,2,3,4};//这里直接初始化了,有兴趣的童鞋可以自己改改int b[]={4,3,2,1};//b是a的逆序拷贝数组。int Min=caluatemin(a,3);int Max=calculatemax(b,3);printf("Min=%d\n",Min);printf("Max=%d\n",Max);printf("极值=%d",Max-Min);return 0;
}

最后说几句,这个代码还有很大的优化空间,这只是一个初级版。

例如,求最大最小两个数可以使用堆排序,这个排序在我之前的博客里面又讲到。

其次,那两个位置记录可以使用指针,让代码更加的简介等等。

欢迎各位网友留言讨论!!

贪心算法基础(一)——数列极差相关推荐

  1. 《趣学算法(第2版)》读书笔记 Part 4 :贪心算法基础(操作)

    14天阅读挑战赛 系列笔记链接 <趣学算法(第2版)>读书笔记 Part 1 :如何高效学习算法 <趣学算法(第2版)>读书笔记 Part 2 :算法入门 <趣学算法(第 ...

  2. 算法4:数列极差问题(贪心算法)

    文章目录 问题描述: 代码及说明 问题描述: 在黑板上写了N个正整数作成的一个数列,进行如下操作: 每次擦去其中的两个数a和b,然后在数列中加入一个数a*b+1,如此下去直到黑板上剩下一个数,在所有按 ...

  3. 4.25分享(贪心算法基础)

    这里写目录标题 贪心选择的概念 解题的基本思路 对贪心算法的理解 贪心算法的基本流程: 例题 部分背包问题 纸币找零问题 贪心算法与动态规划的区别 坚果保龄球 贪心选择的概念 贪心算法总是做出在当前看 ...

  4. POJ 4151/北大百练 4151 电影节 题解(两种方法)贪心算法基础

    POJ4151 电影节 总时间限制: 1000ms 内存限制: 65536kB 描述: 大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看( ...

  5. 152. Leetcode 剑指 Offer 14- II. 剪绳子 II (贪心算法-基础题目)

    class Solution:def cuttingRope(self, n: int) -> int:if n < 4:return n - 1res = 1while n > 4 ...

  6. 151. Leetcode 剑指 Offer 14- I. 剪绳子 (贪心算法-基础题目)

    class Solution:def cuttingRope(self, n: int) -> int:if n <= 3:return n-1a, b = n // 3, n % 3if ...

  7. 150. Leetcode 860. 柠檬水找零 (贪心算法-基础题目)

    有如下三种情况: •情况一:账单是5,直接收下. •情况二:账单是10,消耗一个5,增加一个10 •情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个 5 class Solution ...

  8. 149. Leetcode 1005. K 次取反后最大化的数组和 (贪心算法-基础题目)

    那么本题的解题步骤为: 第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小 第二步:从前向后遍历,遇到负数将其变为正数,同时K-- 第三步:如果K还大于0,那么反复转变数值最小的元素,将 ...

  9. 148. Leetcode 455. 分发饼干 (贪心算法-基础题目)

    class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g.sort()s.sort()m ...

最新文章

  1. 029 浏览器不能访问虚拟机的问题解决
  2. java 简单万年历_JAVA实现的简单万年历代码
  3. flaskr 报错及其修改
  4. fast-rcnn练习资料整理
  5. Idea中一个服务按多个端口同时启动
  6. 致远OA任意文件下载漏洞(CNVD-2020-62422)
  7. 腾讯招.NET5,居然要求精通MySQL,而不是SQLServer!
  8. python保存为xlsb_Read XLSB File in Pandas Python
  9. MySQL数据库基础(mysql数据类型、数据表的操作)
  10. WEB自定义控件小记
  11. week06 12 我们准备数据 前端调用rpc 前后端联调一下
  12. 轻芒联合创始人、CTO 范怀宇亲述《使用小程序做交互的技巧》
  13. esri-leaflet入门教程(4)-加载各类图层
  14. JS中的大括号{}和中括号[]详解
  15. 以人为尊真我生活,Leave the world behind
  16. [!] No `Podfile' found in the project directory.
  17. vue弹出alert_vue.extend实现alert模态框弹窗步骤详解
  18. 将文件中的单词及翻译导入数据库
  19. Oracle用户管理的备份与恢复(冷热)
  20. 解决Fedora Linux双屏输入法无法切换问题

热门文章

  1. 自定义百度地图InfoWindow样式
  2. 计算机毕业设计(22)java毕设作品之在线教育视频点播学习系统
  3. 查询水果价格 (15分)
  4. matlab 信号插零,【 MATLAB 】MATLAB 实现模拟信号采样后的重建(二)零阶保持(ZOH)...
  5. ChatGPT 以及相关开源项目体验
  6. 强大的抓包工具 Fiddler Web Debugger v5.0 中文破解版
  7. 苹果手机安装fiddler证书抓包https流程
  8. 语音识别实时对比(百度收费 VS SpeechTexter免费)
  9. mysql qc_MySQL数据库编程中QC的使用方法
  10. Android Google Maps API 网络服务用于网络定位、计算路线、获取经纬度、获取详细地址等