[编程题] 疯狂队列

来源:互联网 发布:网络水军是什么现象 编辑:程序博客网 时间:2024/05/23 02:06

[编程题] 疯狂队列

时间限制:1秒

空间限制:32768K

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

输出例子1:
100
思路:尽可能从中间取。 奇数和偶数分开讨论。 感觉这题代码有的有点渣。

#include <iostream>#include <algorithm>using namespace std;int a[500];int b[500];int c[500];int d[500];int main(){    int n;    cin>>n;    for(int i=1; i<=n; i++)        cin>>a[i];    sort(a+1,a+1+n);    int cnt=1;    int cntc=1;    for(int i=(n+1)/2 +1; i<=n; i++)        b[cnt++]=a[i];    if(n&1)        for(int i=(n+1)/2-1; i>=1; i-- )            c[cntc++]=a[i];    else for(int i=(n+1)/2; i>=1; i--)            c[cntc++]=a[i];    int db=1,dc=1;    if(n&1)    {        for(int i=1; i<=n; i++)        {            if(i&1)                d[i]=b[db++];            else                d[i]=c[dc++];        }        d[n]=a[(n+1)/2];    }    else    {        int right=n/2;        int left=n/2+1;        int m=n;        dc=n/2;        db=n/2;        int k=1;        while(m)        {            d[right]=b[db--];            d[left]=c[dc--];            if(k&1)            {                right=n/2+k+1;                left=n/2-k;            }            else            {                right=n/2-k;                left=n/2+1+k;            }            k++;            m-=2;        }    }    int ans=0;    for(int i=2; i<=n; i++)    {        ans+=abs(d[i]-d[i-1]);    }    cout<<ans<<endl;}




原创粉丝点击