贪心算法基础(一)——数列极差
贪心算法的思想就是用局部的最优解,达到最后全局的最优解。贪心算法使用是有限制的,一个问题能不能使用贪心来做,往往我们要对其进行必要的证明。贪心算法策略具有无后向性,也就是当前阶段的状态确定之后,不受后面阶段状态的影响。
现在我们先将一个能使用贪心算法的问题——数列极差。
问题描述:在黑板上写了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;
}
最后说几句,这个代码还有很大的优化空间,这只是一个初级版。
例如,求最大最小两个数可以使用堆排序,这个排序在我之前的博客里面又讲到。
其次,那两个位置记录可以使用指针,让代码更加的简介等等。
欢迎各位网友留言讨论!!
贪心算法基础(一)——数列极差相关推荐
- 《趣学算法(第2版)》读书笔记 Part 4 :贪心算法基础(操作)
14天阅读挑战赛 系列笔记链接 <趣学算法(第2版)>读书笔记 Part 1 :如何高效学习算法 <趣学算法(第2版)>读书笔记 Part 2 :算法入门 <趣学算法(第 ...
- 算法4:数列极差问题(贪心算法)
文章目录 问题描述: 代码及说明 问题描述: 在黑板上写了N个正整数作成的一个数列,进行如下操作: 每次擦去其中的两个数a和b,然后在数列中加入一个数a*b+1,如此下去直到黑板上剩下一个数,在所有按 ...
- 4.25分享(贪心算法基础)
这里写目录标题 贪心选择的概念 解题的基本思路 对贪心算法的理解 贪心算法的基本流程: 例题 部分背包问题 纸币找零问题 贪心算法与动态规划的区别 坚果保龄球 贪心选择的概念 贪心算法总是做出在当前看 ...
- POJ 4151/北大百练 4151 电影节 题解(两种方法)贪心算法基础
POJ4151 电影节 总时间限制: 1000ms 内存限制: 65536kB 描述: 大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看( ...
- 152. Leetcode 剑指 Offer 14- II. 剪绳子 II (贪心算法-基础题目)
class Solution:def cuttingRope(self, n: int) -> int:if n < 4:return n - 1res = 1while n > 4 ...
- 151. Leetcode 剑指 Offer 14- I. 剪绳子 (贪心算法-基础题目)
class Solution:def cuttingRope(self, n: int) -> int:if n <= 3:return n-1a, b = n // 3, n % 3if ...
- 150. Leetcode 860. 柠檬水找零 (贪心算法-基础题目)
有如下三种情况: •情况一:账单是5,直接收下. •情况二:账单是10,消耗一个5,增加一个10 •情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个 5 class Solution ...
- 149. Leetcode 1005. K 次取反后最大化的数组和 (贪心算法-基础题目)
那么本题的解题步骤为: 第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小 第二步:从前向后遍历,遇到负数将其变为正数,同时K-- 第三步:如果K还大于0,那么反复转变数值最小的元素,将 ...
- 148. Leetcode 455. 分发饼干 (贪心算法-基础题目)
class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g.sort()s.sort()m ...
最新文章
- 029 浏览器不能访问虚拟机的问题解决
- java 简单万年历_JAVA实现的简单万年历代码
- flaskr 报错及其修改
- fast-rcnn练习资料整理
- Idea中一个服务按多个端口同时启动
- 致远OA任意文件下载漏洞(CNVD-2020-62422)
- 腾讯招.NET5,居然要求精通MySQL,而不是SQLServer!
- python保存为xlsb_Read XLSB File in Pandas Python
- MySQL数据库基础(mysql数据类型、数据表的操作)
- WEB自定义控件小记
- week06 12 我们准备数据 前端调用rpc 前后端联调一下
- 轻芒联合创始人、CTO 范怀宇亲述《使用小程序做交互的技巧》
- esri-leaflet入门教程(4)-加载各类图层
- JS中的大括号{}和中括号[]详解
- 以人为尊真我生活,Leave the world behind
- [!] No `Podfile' found in the project directory.
- vue弹出alert_vue.extend实现alert模态框弹窗步骤详解
- 将文件中的单词及翻译导入数据库
- Oracle用户管理的备份与恢复(冷热)
- 解决Fedora Linux双屏输入法无法切换问题
热门文章
- 自定义百度地图InfoWindow样式
- 计算机毕业设计(22)java毕设作品之在线教育视频点播学习系统
- 查询水果价格 (15分)
- matlab 信号插零,【 MATLAB 】MATLAB 实现模拟信号采样后的重建(二)零阶保持(ZOH)...
- ChatGPT 以及相关开源项目体验
- 强大的抓包工具 Fiddler Web Debugger v5.0 中文破解版
- 苹果手机安装fiddler证书抓包https流程
- 语音识别实时对比(百度收费 VS SpeechTexter免费)
- mysql qc_MySQL数据库编程中QC的使用方法
- Android Google Maps API 网络服务用于网络定位、计算路线、获取经纬度、获取详细地址等