牛客寒假算法基础集训营1小a与“204”

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaohaibo_/article/details/86654886

题目描述
小a非常喜欢204这个数字,因为′a′+′k′=204。现在他有一个长度为n的序列,其中只含有2,0,4这三种数字设ai为序列中第i个数,你需要重新排列这个数列,使得 ( a i a i 1 ) 2 ∑(a_i−a_{i−1})^2 最大(公式的含义是:每个数与前一个数差的平方的和)
注意:我们默认 a 0 = 0 a_0=0 .

输入描述:
第一行一个整数n
接下来一行n个整数,第i个数表示ai

输出描述:
输出一个整数,表示 ( a i a i 1 ) 2 ∑(a_i−a_{i−1})^2 的最大值

示例1
输入

2
2 4

输出

20

说明
样例1解释:按(4,2)排列是最优的,此时sum=(4−0)2+(2−4)2=20.

示例2
输入

5
2 4 0 2 4

输出

52

贪心,尽量的把最小的和最大的数放一起
先排序,然后按照 0 n 1 n-1 2 n-2…这种规律放数

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

typedef long long ll;
const int N = 100010;
int a[N], b[N];

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i ++ ) cin >> a[i];
    sort(a, a + n + 1);

    for (int i = 0, j = 0; j <= n; i ++, j += 2) b[j] = a[i];
    for (int i = n, j = 1; j <= n; i --, j += 2) b[j] = a[i];

    int res = 0;
    for (int i = 1; i <= n; i ++ ) res += (b[i] - b[i-1]) * (b[i] - b[i-1]);

    cout << res << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhaohaibo_/article/details/86654886