疯狂序列
题目:小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,n个学生在列队的时候,小易老师正好去卫生间了。学生们终于有机会反击了,于是学生们决定来一次疯狂的队列,他们定义一个队列的疯狂值为每对相邻排列学生身高差的绝对值总和。由于按照身高顺序排列的队列的疯狂值是最小的,他们当然决定按照疯狂值最大的顺序来进行列队。现在给出n个学生的身高,请计算出这些学生列队的最大可能的疯狂值。小易老师回来一定会气得半死。
输入描述:输入包括两行,第一行一个整数n(1 ≤ n ≤ 50),表示学生的人数
第二行为n个整数h[i](1 ≤ h[i] ≤ 1000),表示每个学生的身高
输出描述:
输出一个整数,表示n个学生列队可以获得的最大的疯狂值。
如样例所示:
当队列排列顺序是: 25-10-40-5-25, 身高差绝对值的总和为15+30+35+20=100。
这是最大的疯狂值了。
前言
想来想去还是买了个ipad,有点肉疼,暑假赚钱还把。
思路
例如:10 40 5 25 13
第一步:首先将数组排序:5 10 13 25 40
第二步:取数组的最大值max和最小值min,计算差值diff=max-min;
第三步:将数组的第二大的数maxIndex和第二小的数minIndex添加进来,此时
diff=nums[maxIndex]-min+diff;
diff=max-nums[minIndex]+diff;
因为是添加进来两个数,因此有两个值。
此时的最大值为倒数第二大的值,最小值为倒数第二小的值
max=nums[maxIndex]
min=nums[minIndex]
第四步: maxIndex–, minIndex++进行循环。
第五步:加入最后一个数,并比较在数组头和尾那个更大
代码
package mianshiti;
import java.util.Arrays;
import java.util.Scanner;
public class Main{
Scanner scan=new Scanner(System.in);
while(scan.hasNextInt()){
int n=scan.nextInt();
int [] nums=new int [n];
for( int i=0;i<n;i++){
nums[i]=scan.nextInt();
Arrays.sort(nums[n-1]);
int max=nums[n-1];
int min=nums[0];
int diff=max-min;
int maxIndex=n-2;
int minIndex=1;
while(minIndex<maxIndex){
diff+=max-nums[minIndex];
diff+=nums[maxIndex]-min;
max=nums[maxIndex];
min=nums[minIndex];
}
diff+=Math.max(nums[maxIndex]-min, max-nums[minIndex]);
}
System.out.println(diff);
}
}