20190123 2019牛客寒假算法基础集训营1 B 小a与"204"
链接:https://ac.nowcoder.com/acm/contest/317/B
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小a非常喜欢204这个数字,因为′a′+′k′=204。
现在他有一个长度为n的序列,其中只含有2,0,42,0,4这三种数字
设为序列中第i个数,你需要重新排列这个数列,使得最大(公式的含义是:每个数与前一个数差的平方的和)
注意:我们默认
输入描述:
第一行一个整数
接下来一行个整数,第i个数表示
输出描述:
输出一个整数,表示的最大值
示例1输入
2
2 4
输出
20
说明
样例1解释:按(4,2)排列是最优的,此时sum=(4−0)+(2−4)=20
示例2输入
3
2 0 4
输出
36
说明
样例2解释:按(4,0,2)排列是最优的,此时sum=(4−0)+(0−4)+(2−0)=36
示例3输入
5
2 4 0 2 4
输出
52
备注:
1⩽n⩽10,保证为2/0/4中的数
题解
贪心?奇数位置放从后边开始放,偶数位置从前边开始放,用两个指针l,r标记就可以了?
真神奇!
比赛的时候WA了4发,原来是方法错了,但是之后也没想到合适的方法,就放弃了,自闭...
Codes
AC代码(抄过来的)
#pragma warning(disable:4996)
#include <bits/stdc++.h>
//#define LOCAL
using namespace std;
const int maxn = 2*1e6+10;
typedef long long ll;
int a[maxn], ans[maxn];
void solve()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
sort(a+1, a+n+1);
int l = 1, r = n;
for (int i = 1; i <= n; i++)
{
if (i & 1) ans[i] = a[r--];
else ans[i] = a[l++];
}
ll res = 0;
for (int i = 1; i <= n; i++)
res += (ans[i] - ans[i - 1])*(ans[i] - ans[i - 1]);
cout << res << endl;
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
solve();
return 0;
}