题目链接:
https://ac.nowcoder.com/acm/contest/317/B
题目描述:
小a非常喜欢204这个数字,因为′a′+′k′=204。
现在他有一个长度为n的序列,其中只含有2,0,4这三种数字
设ai为序列中第i个数,你需要重新排列这个数列,使得∑ni=1(ai−ai−1)2最大(公式的含义是:每个数与前一个数差的平方的和)
注意:我们默认a0=0
输入描述:
第一行一个整数n
接下来一行n个整数,第i个数表示ai
输出描述:
输出一个整数,表示∑ni=1(ai−ai−1)2的最大值
示例1
输入
2
2 4
输出
20
说明
样例1解释:按(4,2)
排列是最优的,此时sum=(4−0)2+(2−4)2=20
示例2
输入
3
2 0 4
输出
36
说明
样例2解释:按(4,0,2)
排列是最优的,此时sum=(4−0)2+(0−4)2+(2−0)2=36
示例3
输入
5
2 4 0 2 4
输出
52
备注:
1⩽n⩽105,保证ai为2/0/4中的数
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a ,int b)
{
return a>b;
}
int a[1000000],b[1000000];
int main()
{
int n,m=0;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
cin>>a[i];
}
sort(a,a+n,cmp);
int j=0;
b[0]=0;
for(int i=0; i<n; i++) //核心代码
{
if(i%2==0)
{
b[i+1]=a[j];
j++;
}
else
b[i+1]=a[n-j];
}
for(int i=1; i<=n; i++)
{
//cout<<b[i]<<" ";
m=m+(b[i]-b[i-1])*(b[i]-b[i-1]);
}
printf("%d\n", m);
}
//此题也可以桶排序0,2,4的个数,然后if每个条件判断