小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,n个学生在列队的时候,小易老师正好去卫生间了。学生们终于有机会反击了,于是学生们决定来一次疯狂的队列,他们定义一个队列的疯狂值为每对相邻排列学生身高差的绝对值总和。由于按照身高顺序排列的队列的疯狂值是最小的,他们当然决定按照疯狂值最大的顺序来进行列队。现在给出n个学生的身高,请计算出这些学生列队的最大可能的疯狂值。小易老师回来一定会气得半死。
输入描述:

输入包括两行,第一行一个整数n(1 ≤ n ≤ 50),表示学生的人数
第二行为n个整数h[i](1 ≤ h[i] ≤ 1000),表示每个学生的身高

输出描述:

输出一个整数,表示n个学生列队可以获得的最大的疯狂值。

如样例所示:
当队列排列顺序是: 25-10-40-5-25, 身高差绝对值的总和为15+30+35+20=100。
这是最大的疯狂值了。
示例1
输入

5
5 10 25 40 25
输出

100

解析:该题目放的规律比较明显,要想获得最大的疯狂值,先给数组排序,然后把最大的放中间,两边放最小的,然后两边放次大的,然后两边再放次小的…

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;public class Main {//5 10 25 25 40//25-10-40-5-25public static int getMaxCrazy(int []arr,int n){Arrays.sort(arr);LinkedList<Integer> queue = new LinkedList<>();queue.add(arr[n-1]);int low=0;int high=n-2;int count=n-1;//剩余需要取得数int index=0;//奇偶交替放大小的数if((n-1)%2==0){//剩余的数是偶数个for(int i=0;i<(n-1)/2;i++){if(index%2==0){//取最小的两个数int  min1 =arr[low++];int min2=arr[low++];int first=queue.getFirst();int last =queue.getLast();int sum1=Math.abs(first-min1)+Math.abs(last-min2);int sum2=Math.abs(first-min2)+Math.abs(last-min1);if(sum1>sum2){queue.addFirst(min1);queue.addLast(min2);}else{queue.addFirst(min2);queue.addLast(min1);}index++;}else{//取两个次大的数int  max1 =arr[high--];int max2=arr[high--];int first=queue.getFirst();int last =queue.getLast();int sum1=Math.abs(first-max1)+Math.abs(last-max2);int sum2=Math.abs(first-max2)+Math.abs(last-max1);if(sum1>sum2){queue.addFirst(max1);queue.addLast(max2);}else{queue.addFirst(max2);queue.addLast(max1);}index++;}}}else{//count=3//5 10 25 40//25-10-40-5for(int i=0;i<(n-1)/2+1;i++){if(index%2==0){//取小的数if(count-2>=0){//一次放两个int  min1 =arr[low++];int min2=arr[low++];int first=queue.getFirst();int last =queue.getLast();int sum1=Math.abs(first-min1)+Math.abs(last-min2);int sum2=Math.abs(first-min2)+Math.abs(last-min1);if(sum1>sum2){queue.addFirst(min1);queue.addLast(min2);}else{queue.addFirst(min2);queue.addLast(min1);}index++;count-=2;}else{//一次放一个int  min1 =arr[low++];int first=queue.getFirst();int last =queue.getLast();int sum1=Math.abs(first-min1);int sum2=Math.abs(last-min1);if(sum1>sum2){queue.addFirst(min1);}else{queue.addLast(min1);}index++;count-=1;}}else{if(count-2>=0){//一次放两个int  max1 =arr[high--];int max2=arr[high--];int first=queue.getFirst();int last =queue.getLast();int sum1=Math.abs(first-max1)+Math.abs(last-max2);int sum2=Math.abs(first-max2)+Math.abs(last-max1);if(sum1>sum2){queue.addFirst(max1);queue.addLast(max2);}else{queue.addFirst(max2);queue.addLast(max1);}index++;count-=2;}else{//一次放一个int  max1 =arr[high--];int first=queue.getFirst();int last =queue.getLast();int sum1=Math.abs(first-max1);int sum2=Math.abs(last-max1);if(sum1>sum2){queue.addFirst(max1);}else{queue.addLast(max1);}index++;count-=1;}}}}List<Integer> list = new ArrayList<>(queue);int max=0;for(int i=1;i<list.size();i++){max+=Math.abs(list.get(i)-list.get(i-1));}int temp=queue.pop();//需要检测队首的元素放在队尾的情况,不然只能通过90%queue.addLast(temp);list = new ArrayList<>(queue);int max2=0;for(int i=1;i<list.size();i++){max2+=Math.abs(list.get(i)-list.get(i-1));}return Math.max(max, max2);}public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNextLine()){int n =sc.nextInt();int [] arr= new int[n];for(int i=0;i<n;i++){arr[i]=sc.nextInt();}System.out.println(getMaxCrazy(arr, n));}}}

《网易编程题》疯狂队列相关推荐

  1. 2018校招笔试题——网易编程题跳石板

    题目与要求如下所示: [编程题] 跳石板 时间限制:1秒 空间限制:32768K 小易来到了一条石板路前,每块石板上从1挨着编号为:1.2.3....... 这条石板路要根据特殊的规则才能前进:对于小 ...

  2. 《网易编程题》计算糖果

    题目描述 A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息: A - B, B - C, A + B, B + C. 这四个数值.每个 ...

  3. 《网易编程题》藏宝图

    题目描述 牛牛拿到了一个藏宝图,顺着藏宝图的指示,牛牛发现了一个藏宝盒,藏宝盒上有一个机关,机关每次会显示两个字符串 s 和 t,根据古老的传说,牛牛需要每次都回答 t 是否是 s 的子序列.注意,子 ...

  4. 《网易编程题》下厨房

    题目:牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料. 输入描述: 每个输入包含 1 个测试用例.每个测试用例的第 i 行,表示完成第 i 件料理需要哪些 ...

  5. 【网易编程题】小易魔法王国采购魔法神器

    原题: 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币. 魔法机器1:如果投入x个 ...

  6. 《网易编程题》买苹果

    题目描述 小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分). 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带.如果不能购买恰好n个苹果 ...

  7. 《网易编程题》分苹果

    题目描述 n 只奶牛坐在一排,每个奶牛拥有 ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少 ...

  8. 网易编程题------操作序列

    题目描述 小易有一个长度为n的整数序列,a_1,...,a_n.然后考虑在一个空序列b上进行n次以下操作: 1.将a_i放入b序列的末尾 2.逆置b序列 小易需要你计算输出操作n次之后的b序列. 输入 ...

  9. 编程题--疯狂序列----京东大数据笔试

    1. 题目描述 东东从京京那里了解到有一个无限长的数字序列: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, -(数字k在该序列中正好出现k次).东东想知道这 ...

最新文章

  1. Eigen:C++中Eigen库的安装与学习
  2. python添加数组元素_Python列表附录–如何向数组添加元素,并附带示例说明
  3. 第三章GIT使用入门
  4. Nacos源码更服务列表
  5. 寒风之家 » Thrift压缩
  6. python pyqt5 线程 暂停 重启_PyQt5 线程阻塞?
  7. java如何将String转换为enum
  8. JavaScript数组方法终极指南-地图
  9. HTTP2.0,HTTP1.1,HTTP1.0三者在通性性能上的优化方法
  10. 编译安装的mysql如何更改文件路径
  11. 一个非常强大的静态导航网站nav
  12. Java进阶(二十九)集合12:集合练习题
  13. android三国2,三国演义2单机版安卓
  14. afrog 发布新版 Release 1.3.6 漫天星辰
  15. 电脑任务栏卡死的解决方法
  16. UVM重点归纳(一)
  17. 2021.11.08 - 143.猜数字游戏
  18. 支付宝AR红包关闭,看昔日“网红”如何过气
  19. 街机游戏linux模拟器_适用于Linux的5种街机风格游戏
  20. 人工智能未来替代的职位,主要有哪些行业?

热门文章

  1. ByteBuf的源码分析
  2. Dev C++ 无法调试问题的解决——小白也能看懂!
  3. Web前端开发笔记——第三章 CSS语言 第一节 CSS的基本概念和样式表
  4. 计算机网络实验(华为eNSP模拟器)——第八章 动态主机配置协议(DHCP)
  5. C语言 计算结构体大小
  6. unity android 符号表,记录腾讯bugly关于符号表的配置
  7. ethercat通讯协议_工业控制常用接口协议大全,长见识了
  8. mysql数据库崩_mysql数据库崩溃_MySQL
  9. 交换机登入linux ftp,巧用FTP 实现交换机间配置文件复制
  10. python异常处理操作语句_异常处理语句(2)