列表

详情


WY40. 疯狂队列

描述

小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,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

原站题解

C++ 解法, 执行用时: 1ms, 内存消耗: 368KB, 提交时间: 2017-08-15

#include <iostream>
#include <algorithm>
#include "vector"
using namespace std;

int main()
{
	vector<int> tt;
	int n;
	int a;
	cin>>n;

	for (int i=0;i<n;i++)
	{
		cin>>a;
		tt.push_back(a);
	}

	std::sort(tt.begin(),tt.end(),std::greater<int>());

	//cout<<tt[0]<<endl;
	int max = tt[0];  //获取最大值
	int min = tt[n-1]; //获取最小值

	int maxline = 1;  //获取下一个最大值的下标
	int minline = n-1-1; //获取下一个最小值的小标
	int sum = max - min;
	while (minline > maxline)
	{
		sum += max - tt[minline] + tt[maxline] - min;
		max = tt[maxline++];
		min = tt[minline--];
	}
	
	if ((max-tt[minline])>(tt[maxline]-min))
	{
		sum += max-tt[minline];
	}
	else
	{
		sum+= tt[maxline]-min;
	}

	cout<<sum<<endl;
	return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2017-11-03

#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main() {
    int n;
    cin >> n;
    vector<int> a(n, 0);
    for (int i = 0; i < n; ++i)
        cin >> a[i];
    sort(a.begin(), a.end());
    
    int ret=0;
    if(n%2)
    {
        ret+=a[n/2];
        ret+=a[n/2+1];
        for(int i=n/2+2;i<n;i++)
        {
            ret+=2*a[i];
        }
        for(int i=0;i<n/2;i++)
        {
            ret-=2*a[i];
        }
    }
    else
    {
        ret+=a[n/2];
        ret-=a[n/2-1]; 
        for(int i=0;i<n/2-1;i++)
        {
            ret-=2*a[i];
        }
        for(int i=n/2+1;i<n;i++)
        {
            ret+=2*a[i];
        }
    }
    
    cout << ret << endl;
    return 0;
}

上一题