牛客——小a与"204"

题目链接:https://ac.nowcoder.com/acm/contest/317/B

官方题解:考点:贪心 模拟

输入的序列其实用处不大,因为最终不需要输出方案,我们只需要记录下2/0/4分别出现的次数即可 一个显然的构造策略是首先放置4, 0, 4, 0,直到其中一个用光。

接下来如果4多余,那么可以按4,0,4,0,…,4,2,4,2,…(先4后2)的方法构造

如果0多余,可以按照4,0,4,0    …    4,0,2,0,2    …(先2后0)的方法构造

std中的a数组展示了其中一种最优的构造方案

实际上此题还可以推广到更一般的情况,也就是第一个位置放最大的,第二个位置放最小的,第三个位置放 第二大的以此类推,这种思路写起来也会更简单一些

思路:

不需要像样例那样排列,题目只要最大值。先从小到大排序,然后分成两部分,最大的减最小的,第二大的减第二小的,以此类推

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int a[100005],b[100005],c[100005];
int main()
{
    int n,i,m=0;
    long long sum=0;
    scanf("%d",&n);
    for(i=1; i<=n; i++)
    {
        scanf("%d",&a[i]);
    }
    sort(a+1,a+1+n);
    for(i=1; i<=n/2; i++)
    {
        b[i]=a[i];
    }
    for(i=n; i>n/2; i--)
    {
        c[m]=a[i];
        m++;
    }
    for(i=0; i<(n+1)/2; i++)
    {
        sum+=(c[i]-b[i])*(c[i]-b[i]);
    }
    for(i=0; i<n/2; i++)
    {
        sum+=(c[i]-b[i+1])*(c[i]-b[i+1]);
    }
    printf("%lld\n",sum);
}


 

猜你喜欢

转载自blog.csdn.net/qq_43380477/article/details/86640456