贪心算法-数列极差问题-JAVA
贪心算法-数列极差问题
【题目描述】
在黑板上写了N个正整数做成的一个数列,进行如下操作:每一次擦去其中的两个数a和b,然后在数列中加入一个数a×b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的max,最小的为min,则该数列的极差定义为M=max-min。
编程任务:对于给定的数列,编程计算出极差M。
输入输出样例:
输入:
4
2 1 4 3
输出:
13
【算法分析】
当看到此题时,我们会发现求max与求min是两个相似的过程。若我们把求解max与min的过程分开,着重探讨求max的问题。
下面我们以求max为例来讨论此题用贪心策略求解的合理性。
讨论:假设经(N-3)次变换后得到3个数:a ,b , max'(max'≥a≥b),其中max'是(N-2)个数经(N-3)次f变换后所得的最大值,此时有两种求值方式,设其所求值分别为 z1,z2,则有:z1=(a×b+1)×max'+1,z2=(a×max'+1)×b+1所以z1-z2=max'-b≥0若经(N-2)次变换后所得的3个数为:m,a,b(m≥a≥b)且m不为(N-2)次变换后的最大值,即m<max'则此时所求得的最大值为:
z3=(a×b+1)×m+1此时z1-z3=(1+ab)(max'-m)>0 所以此时不为最优解。
所以若使第k(1≤k≤N-1)次变换后所得值最大,必使(k-1)次变换后所得值最大(符合贪心策略的特点2),在进行第k次变换时,只需取在进行(k-1)次变换后所得数列中的两最小数p,q施加f操作:p←p×q+1,q←∞即可(符合贪心策略特点1),因此此题可用贪心策略求解。在求min时,我们只需在每次变换的数列中找到两个最大数p,q施加作用 f:p←p×q+1,q←-∞即可.原理同上。
这是一道两次运用贪心策略解决的一道问题,它要求选手有较高的数学推理能力。
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int [] n = new int[N];int max,min;for (int i = 0; i < N; i++) {n[i] = sc.nextInt();}int[] nclone = n.clone();//拷贝一次数组,因为有两次操作,分别求max和min。//求出MAX:int m = 0;while(m != N-1){for (int i = m; i < m+2; i++) {//循环为m到m+2,因为每次只要求出两个最小的值。for (int j = i+1; j < n.length; j++) {if(n[j]<n[i]){int temp = n[j];n[j] = n[i];n[i] = temp;}}if(i==m+1){n[i] = n[i-1]*n[i]+1;}}m++;}max = n[N-1];//求出MIN:m = 0;//重新初始化m。while(m != N-1){for (int i = m; i < m+2; i++) {for (int j = i+1; j < nclone.length; j++) {if(nclone[j]>nclone[i]){//事实上只是将小于号改为大于号即可。int temp = nclone[j];nclone[j] = nclone[i];nclone[i] = temp;}}if(i==m+1){nclone[i] = nclone[i-1]*nclone[i]+1;}}m++;}min = nclone[N-1];//MAX - MIN :System.out.println(max - min);}
}
编程的思路:
每次排序仅排除最小(或最大)的两个数,然后将二者运算的结果放在第二个数的位置,然后从第二个数的位置开始往后排序,重复上述过程。最后得到数组最末尾的那个数就是运算的MAX(或MIN)的结果。MAX-MIN即可得解。
贪心算法-数列极差问题-JAVA相关推荐
- 贪心算法-数列极差问题(对前篇文章的修改)
package com.work.home_3_1; import java.util.Arrays; /** * 贪心算法-数列极差问题 * 1. 问题描述: * N个正数数列 ...
- 贪心算法——数列极差
题目描述 佳佳的老师在黑板上写了一个由 n 个正整数组成的数列,要求佳佳进行如下操作:每次擦去其中的两个数 a 和 b,然后在数列中加入一个数 a×b+1,如此下去直至黑板上剩下一个数为止,在所有按这 ...
- 【贪心】数列极差问题
题目描述 "我就说你在忽悠我吧,我刚才问了昆士兰大学的好多魔法师,他们根本就没有一个人想过做什么时间旅行的实验,但搞笑的是,他们居然对你的理论很感兴趣,想找个时间和你做进一步的讨论.哎,我还 ...
- java零钱换整程序_贪心算法换零钱(java)
贪心算法思想 贪心算法总是做出在当前看来做好的选择.也就是说贪心算法并不从整体最后考虑,他做出的选择只是局部最优选择.他所做出的仅是在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解, ...
- 贪心算法之柠檬水java
贪心算法的基本思想: 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解.用局部解构造全局解,即从问题的某一个初始解逐 ...
- java编程贪心算法背包问题,贪心算法----部分背包问题(java实现)
部分背包问题 给定 n 种物品和一个背包.物品 i 的重量是 Wi,其价值为 Vi,背包的容量为 C.在选择物品 i 装入背包时,可以选择物品 i 的一部分,1<= i <=n.问应如何选 ...
- Prim算法实现最小生成树(Java)
最小生成树包含n个顶点和(n-1)条边,并且边的权重最小.Prim算法的思想是:由一颗小树慢慢长大,首先分为两个顶点集合,最小生成树的顶点集合A,和不在生成树中的顶点集合B,每次从B中找一个顶点v,使 ...
- python贪心算法最短路径_dijkstra算法(贪心算法)——解决最短路径问题
最短路径 给定一张带权图和其中的一个点(作为源点),求源点到其余顶点的最短路径 基本思想 1)源点u,所有顶点的集合V,集合S(S中存有的顶点,他们到源点的最短路径已经确定,源点u默认在S中),集合V ...
- 贪心算法基础(一)——数列极差
贪心算法的思想就是用局部的最优解,达到最后全局的最优解.贪心算法使用是有限制的,一个问题能不能使用贪心来做,往往我们要对其进行必要的证明.贪心算法策略具有无后向性,也就是当前阶段的状态确定之后,不受后 ...
最新文章
- 2008年北大核心有效期 计算机类核心(2011-01-31 15:02:46)
- HDU 1544 Palindromes(回文子串)
- 怎么获取html页面追加,添加df.to_html格式()到现有的HTML页面
- 身份证校验原理和PHP实现
- FileChannel应用实例——本地文件读数据
- 三角形内随机生成一个点
- 面试时如何介绍自己的项目经验
- php+页面加载进度,基于jQuery实现模拟页面加载进度条_jquery
- 基于c语言的学生成绩管理系统论文,C语言学生成绩管理系统论文
- 三种常见的ps删除通道的操作
- 《我的团长我的团》书及电视剧观后感
- html背景图片自动铺满屏幕,【CSS背景图片页面自适应充满屏幕】
- html5 数据库 视图,创建视图的sql语句是什么
- DAS Over FC 技术允许 ATTO 分解存储并完成 vSAN 认证套件
- js文件 本地 上传服务器地址,js 本地文件同步服务器地址
- Jedis使用lua脚本完成令牌桶限流
- 车载以太网 - SomeIP - 详细解析 - 02
- 【python量化】国内外基于python开发的量化回测框架
- html设置字体facename,CRichEdit控件操作使用
- 小孩学计算机的电视剧,小时候在教育频道看的一个电视剧,好像是叮当演的,讲一堆小孩学唱戏之类的...
热门文章
- 数字化驱动全价值链卓越运营
- 【Linux】2020配置firefox +geckodriver + selenium 安装及报错解决办法:no DISPLAY environment variable specified
- 从键盘输入一个4x4整数矩阵,以主对角线为对称轴,将右上角元素中较大元素代替左下角对应元素,并将左下角元素
- 矩阵的翻转与旋转()(另附代码)
- 制作DOS的U盘启动
- 51单片机学习笔记【七】——蜂鸣器和继电器
- IT人员转行写小白文可以么?
- 香港进入5G时代!多功能智能灯柱试验计划为5G建设作配合
- git pull 时显示Filename too long的解决办法
- Automatic Targetless Extrinsic Calibration of Multiple 3D LiDARs and Radars