文章目录

  • 问题描述:
  • 代码及说明

问题描述:

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

问题分析:
通过3,5,7三个数字讨论
(3*5+1)7+1=113 ((37)+1)5+1=111 (57+1)*3+1=109
由此可见,每次取其中最小的两个数最后得到的值最大,反之每次取最大的两个数值最小

解题思路:
输入一个数组,然后copy一份,分别求Min,和Max
例如求Min,那么每次都要取最大的数:

1.首先定义全局的数组和数组副本
2.然后定义一个找数组最大数的方法,一层for,每次我都找最大的,将当前最大的数赋值给一个临时变量
以及把此时数组的下标记下来,循环结束,把下标值返回。
3.求得Min的函数:
先用findMax_i()找到一个最大值的下标,将对应值赋给a,之后把numbers[返回的最大下标]=INT_MIN
这样做的目的是下一次比较的时候,数组的这个位置是最小的,不会被取出(相当于去除它)
然后再调用一次findMax_i(),将对应值赋给b,之后将a*b+1的值赋给当前的数组,这样相当于我们把刚才求的值又放回数组中
然后在下一次循环中,再去其中最大的两个值。
循环结束标志:n==1
也就是最后的Min,我们将其从数组中取出即可
这个算法贪心在每次我都要从数组中去出最优解(最大值或最小值)

代码及说明

#include "pch.h"
#include <iostream>
#include<algorithm>
#define INT_MAX 0x7fffffff//32位2进制最大数
#define INT_MIN 0x80000000//32位2进制最小数
using namespace std;
int numbers[100];//数组
int copynumbers[100];//数组副本
int n=0;//记录数组内数字的个数
int copyn = 0;//n的副本//从数组副本中每次都挑选最小值,并返回数组下标
int findMin_i() {int minone = INT_MAX;int k = 0;for (int i = 0; i < n; i++) {if (minone > copynumbers[i]) {minone = copynumbers[i];k = i;}}return k;
}
//从数组中每次都挑选最大值,并返回数组下标
int findMax_i() {int maxone= INT_MIN;int k = 0;//记录下标for (int i = 0; i < n; i++) {if (maxone <numbers[i] ) {maxone = numbers[i];k = i;}}return k;
}
//计算出Min
int getMIN(int array[], int n) {int a;int b;int Max=0;int i;//记录a的下标int j;//记录b的下标while(n!=1){i = findMax_i();//获取数组中的最大值下标a = numbers[i];//将i对应的值赋给anumbers[i] = INT_MIN;//重置i下标的值,使得它为最小值(相当于去除它)j = findMax_i();b= numbers[j];//再获取数组中的最大值(注意其实它是第二大的数,第一大的数是a)numbers[j] = a * b + 1;//将计算结果再放入其中n--;//数组中还剩余的数(除固定值INT_MIN之外)}Max = numbers[findMax_i()];//获取数组中最后一个最大的数(计算的结果)return Max;}
//计算出Max,与Min思路一致
int getMAX(int array[], int n) {int a;int b;int Min = 0;int i;int j;while (n != 1) {i = findMin_i();a = copynumbers[i];copynumbers[i] = INT_MAX;j = findMin_i();b = copynumbers[j];copynumbers[j] = a * b + 1;n--;}Min = copynumbers[findMin_i()];return Min;}
int main()
{cout << "请输入数字的个数:" << endl;cin >> n;copyn = n;//拷贝一份cout << "输入数字:" << endl;for (int i = 0; i < n; i++) {cin >> numbers[i];copynumbers[i] = numbers[i];//拷贝一份}  cout << "最小值为:";int Min = getMIN(numbers,n);cout << Min<<endl;cout << "最大值为:";int Max = getMAX(copynumbers, n);cout << Max<<endl;cout << "数列极差M=" << Max-Min<<endl;
}

运行结果:

算法4:数列极差问题(贪心算法)相关推荐

  1. 求数列极差(贪心算法)

    题目描述] 在黑板上写了N个正整数作成的一个数列,进行如下操作:每一次擦去其中的两个数a和b,然后在数列中加入一个数a×b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的 ...

  2. 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)

    数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...

  3. 哈夫曼编码压缩率计算_程序员的算法课(8)-贪心算法:理解霍夫曼编码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  4. 程序员的算法课(8)-贪心算法:理解霍夫曼编码

    一.一种很贪婪的算法定义 贪心是人类自带的能力,贪心算法是在贪心决策上进行统筹规划的统称. [百度百科]贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体 ...

  5. 算法基础(Java)--贪心算法

    前言 前面简单的介绍了八大经典排序算法,此文将要介绍贪心算法,并介绍一些常见贪心算法题目. 1. 贪心算法的概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最 ...

  6. 算法导论-上课笔记7:贪心算法

    文章目录 0 前言 1 活动选择问题 1.1 活动选择问题的最优子结构 1.2 贪心选择 1.3 递归贪心算法 1.4 迭代贪心算法 2 贪心算法原理 2.1 贪心选择性质 2.2 最优子结构 2.3 ...

  7. 算法学习笔记22:贪心算法

    目录 贪心算法:如何用贪心算法实现Huffman压缩编码 如何理解"贪心算法" 贪心算法实战分析 1.分糖果 2. 钱币找零 3. 区间覆盖 解答开篇 内容小结 贪心算法:如何用贪 ...

  8. 五大常用算法入门(一)——贪心算法

    文章目录 1.贪心算法简介 1.1 基本定义 1.2 贪心算法案例 1.3.贪心算法的基本思路 2.贪心算法最优性证明 2.1 贪心算法的前提 2.2 最优子结构 2.3 贪心算法与动态规划的区别 3 ...

  9. 算法基础--优惠券问题(贪心算法)

    算法基础–优惠券问题(贪心算法) 近期某商场由于周年庆,开启了"0元购"活动.活动中,消费者可以通过组合手中的代金券,实现0元购买指定商品. 聪明的小团想要用算法来帮助他快速计算: ...

  10. 算法设计与分析:贪心算法 - 排课问题(DP与贪心的区别与应用)

    文章目录 前言 贪心算法概念 排课问题 问题描述与分析 动态规划求解 简化问题应用贪心算法 总结 本文参考UCAS卜东波老师算法设计与分析课程撰写 前言 前面两大章节的内容分治思想与动态规划暂时告一段 ...

最新文章

  1. 构建虚拟工控环境系列 - 西门子虚拟PLC
  2. (001) RN开发之Mac搭建开发环境
  3. 【转】使用Apache CXF开发WebServices服务端
  4. python查找指定文件路径_Python寻找路径和查找文件路径的示例
  5. 如何获取当前刀具号_数控刀具的选用原则,如何使用数控刀具?一文全面介绍数控刀具...
  6. 解决方案/DIV+CSS 在 IE7/IE6/Firefox间的兼容性问题
  7. 文件与用户管理linux实验,实验03 Linux用户和权限管理
  8. 什么是Android上的“上下文”?
  9. python注意事项
  10. jiangdongsheng
  11. PHP 可变变量的使用
  12. 简单实用的易语言短信接口demo
  13. 横向堆积柱状图(peak distribution)
  14. MATLAB反色图像处理
  15. 计算机ip怎么换路由器,路由器怎么换ip地址
  16. java public interface_Java 接口interface的基础
  17. c语言 continue什么意思,continue在C语言中什么意思?
  18. 对接第三方顺丰丰桥下单Api接口实战教程java
  19. shell解决买鸡问题:3文钱可以买1只公鸡,2文钱可以买一只母鸡,1文钱可以买3只小鸡。用100 文 钱买100 只鸡,那么各有公鸡、母鸡、小鸡多少只?
  20. 关于学习生活看法的维度

热门文章

  1. NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等
  2. MicroATX 主板 定位孔位图
  3. Java——ArrayList(动态数组)介绍
  4. 机械制图计算机类实验报告,工程制图与CAD实习实验报告模板
  5. Day 2---vue2 从0开始 写一个前端框架
  6. 15个精美的 HTML5 单页网站作品欣赏
  7. 2021-2027全球及中国WiFi热点软件行业研究及十四五规划分析报告
  8. 关于plsql报错 初始化失败
  9. 【测绘程序设计】——附合导线近似平差
  10. 网页播放flv格式的视频