首页 > 试题广场 >

疯狂队列

[编程题]疯狂队列
  • 热度指数:231 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,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

//用贪心,排序之后用两个下标每次选取最大间隔的值

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
    int n;
    scanf("%d", &n);
    vector<int>p; 
    for(int i = 0; i < n; i++) {
        int t;
        scanf("%d", &t);
        p.push_back(t);
    }
    sort(p.begin(), p.end());

    int s = 0, e = p.size() - 2;
    int sum = 0;
   while(s<=e) {
        int sf = abs(res.front() - p[s]);
        int sb = abs(res.back() - p[s]);
        int ef = abs(res.front() - p[e]);
        int eb = abs(res.back() - p[e]);
        if(max(sf, sb) > max(ef, eb)) {
            if(sf > sb) {

                s++;
                sum += sf;
            }
            else{
                s++;
                sum += sb;
            }
        }
       else{
            if(ef > eb) {
                e--; 
                sum += ef; 
            } 
            else{ 
                e--;
                sum += eb;
            }
        }
    }
    printf("%d", sum);
    return 0;

}
编辑于 2018-08-14 15:49:39 回复(0)