- 题目描述
小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,n个学生在列队的时候,小易老师正好去卫生间了。学生们终于有机会反击了,于是学生们决定来一次疯狂的队列,他们定义一个队列的疯狂值为每对相邻排列学生身高差的绝对值总和。由于按照身高顺序排列的队列的疯狂值是最小的,他们当然决定按照疯狂值最大的顺序来进行列队。现在给出n个学生的身高,请计算出这些学生列队的最大可能的疯狂值。小易老师回来一定会气得半死。
输入描述:
输入包括两行,第一行一个整数n(1 ≤ n ≤ 50),表示学生的人数
第二行为n个整数h[i](1 ≤ h[i] ≤ 1000),表示每个学生的身高
输出描述:
输出一个整数,表示n个学生列队可以获得的最大的疯狂值。
输入
5
5 10 25 40 25
输出
100
如样例所示:
当队列排列顺序是: 25-10-40-5-25, 身高差绝对值的总和为15+30+35+20=100。
这是最大的疯狂值了。
- 思路
先将数组排序,再将最大的数放在中间,最小的数放在它前面,_ ,5,40, _ , _ ,接下来再将第二小的数放在40后面,将第二大的树放在5前面。这样循环。。。一直到最后。可以用i,j控制下标,如果最后i=j,说明个数为奇数,算一下i位置上的数和队列头和尾哪一个差比较大就插在哪。 - c++实现
#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;
int main()
{
int i,n,a;
deque<int> q;
vector<int> height;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a;
height.push_back(a);
}
sort(height.begin(),height.end());
int j=n-1,cnt=0,result=0;
i=0;
while(i<j)
{
if(cnt%2==0)
{
q.push_back(height[j--]);
q.push_front(height[i++]);
}
else
{
q.push_back(height[i++]);
q.push_front(height[j--]);
}
cnt++;
}
if(i==j)
{
if(abs(height[i]-q[0])>=abs(height[i]-q[n-2]))
q.push_front(height[i]);
else
q.push_back(height[i]);
}
for(i=1;i<n;i++)
{
result+=abs(q[i]-q[i-1]);
}
cout<<result<<endl;
return 0;
}