20190123 2019牛客寒假算法基础集训营1 B 小a与"204"

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;
}




猜你喜欢

转载自www.cnblogs.com/wchenglin/p/10312818.html