2018网易校招笔试题之疯狂队列

[编程题]疯狂队列

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

时间限制:1秒 空间限制:32768K

输入描述:
输入包括两行,第一行一个整数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

思路:
将原数列排好序,先把数列中最大值和最小值取到,然后两个指针分别指向数列中倒数第二个和第二个值,与最大最小值交叉做差,然后指针一次向后,向前,直到中间两个指针的值相等。如果数列的长度为奇数个,则把最后一个值与现在指针指向的大的那个数或者小的那个数做差,取较大的差值加到sum上即可。

代码:

function CrazyQueue(n, Height) {
    var arrTemp = Height.split(' ');
    var sum = 0;
    var maxNum, minNum, index1, index2;
    for (var i = 0; i < n; i++) {
        arrTemp[i] = parseInt(arrTemp[i]);
    }
    arrTemp.sort(function(a, b) {
        return a - b;
    }); 
    if (n == 1) return sum; 
    minNum = arrTemp[0];
    maxNum = arrTemp[n - 1];
    sum += (maxNum - minNum);
    index1 = 1;
    index2 = n - 2;
    while (index1 < index2) {
        sum += (maxNum - arrTemp[index1]);
        sum += (arrTemp[index2] - minNum); 
        maxNum = arrTemp[index2];
        minNum = arrTemp[index1];
        index1++;
        index2--;
    }
    if (n % 2 == 1) {
        sum += Math.max(arrTemp[index1] - minNum, maxNum - arrTemp[index1]);
    }     return sum;
}
var n = readline();
var Height = readline();
print(CrazyQueue(n, Height)); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值