cf题解--I. Bashar and Hamada

https://codeforces.com/group/5yyKg9gx7m/contest/277016/problem/I

I. Bashar and Hamada

Bashar is a very smart person, he invented a new function F(S), where S is a multiset of integers.

The function F(S) returns the sum of the absolute difference between every pair of elements in S.

For example F({3,3,1,7}) = |3−3| + |3−1| + |3−7| + |3−1| + |3−7| + |1−7| = 18.

After that Bashar gave Hamada an array a that contains n integers, and asked him to solve this problem.

For every k such that (2≤k≤n), Hamada should choose a subsequence of k integers from a, such that F(S) is maximised.

Hamada couldn't solve the problem and he asked you for help.

Input
The first line of input contains one integer n (2≤n≤3×105) which is the size of array a.

The second line contains n integers, the ith one is ai (1≤ai≤108), which is the ith element in the array.

Output
For every k such that (2≤k≤n), print the maximum possible F(S) of a subsequence of size k, starting from k=2 ending at k=n.

Example
inputCopy
3
1 7 5
outputCopy
6 12
Note
a subsequence of size k is a sequnece that can be obtained be removing n−k integers from a.

分析:

首先选择2个数要值最大,就是令他们差最大,所以选最大最小值。

先看一个规律

比如{1,2,3,4,5,7},开始ans=0;

开始:ans+= |1-7|

插入5: ans+=|5-1|+|5-7|=|1-7|

插入2: ans+=|2-1|+|2-7|+|2-5|==|1-7|+|2-5|

插入4: ans+=|4-1|+|4-7|+|4-5|+|4-2|==|1-7|+|2-5|

插入3: ans+=|3-1|+|3-7|+|3-5|+|3-2|+|3-4|==|1-7|+|2-5|+|3-4|

这样列出来就很明显了。奇数次插入,要加的数保存不变。

可以看到每插入2个就增加一个组合,只要每次加入的组合为最大,就能保证答案最大。

每次组合都选差最大的,排序后,就是左右各一个。

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<deque>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=3e5+6;
ll a[maxn];
ll ans=0;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    sort(a+1,a+n+1);
    ans=a[n]-a[1];
    printf("%lld ",ans);
    ll temp=ans;
    int k=n-1;
    int f=2;
    for(int i=1;i<n-1;i++)
    {
        if(i%2==0) temp+=a[k--]-a[f++];
        ans+=temp;
        printf("%lld ",ans);
    }
    return 0;
}

 

上一篇:leetcode-1338 Reduce Array Size to The Half


下一篇:用指向指针的指针的方法对n个整数排序并输出要求将排序单独写成一个函数。n个整数在主函数中输入,最后在主函数中输出