牛客小白月赛18 Forsaken给学生分组

牛客小白月赛18 Forsaken给学生分组

Forsaken给学生分组

链接:https://ac.nowcoder.com/acm/contest/1221/C来源:牛客网

​ Forsaken有nnn个学生,每个学生都有一个能力值aia_iai,为了方便管理,Forsaken决定将nnn个学生分成kkk组。

​ Forsaken认为如果一个小组有一个能力在该小组极其突出的学生,这个小组就比较容易管理。我们定义对于teamiteam_iteami来说,这个小组的管理方便度f(i)=max(aj∈teami)−min(aj∈teami)f(i) = max(a_j \in team_i) - min(a_j \in team_i)f(i)=max(aj∈teami)−min(aj∈teami)。Forsaken现在想知道max(∑i=1kf(i))max(\sum_{i=1}^{k}f(i))max(∑i=1kf(i))。

输入描述:

第一行两个整数分别为n,kn,kn,k。第二行nnn个数分别代表a1,a2...ana_1,a_2...a_na1,a2...an。

输出描述:

一个整数表示最大的管理方便度之和。

示例1

输入

[复制](javascript:void(0)😉

5 1
10 6 2 7 9

输出

[复制](javascript:void(0)😉

8

备注:

1≤n≤1e51 \leq n \leq 1e51≤n≤1e51≤k≤n1 \leq k \leq n1≤k≤n1≤ai≤1e91 \leq a_i \leq 1e91≤ai≤1e9

题解:

贪心。

最优化题两种考虑:贪心,DP。

大佬想DP,蒟蒻想贪心。

因为我是蒟蒻,所以我贪心了。

可以发现,对于每个组来讲,这个组最牛X和这个组最傻X的人的牛X度相差越大越好。

那么对于k组来讲,可以肯定的是,最牛X的k个人和最傻X的k个人肯定不会在同一个组。并且对于第i组来讲,第i牛X的和第i傻X的会对答案做出最大贡献。

那这题就可以秒切了。记得开long long

代码:

#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
const int maxn=1e5+10;
int n,k,ans;
int a[maxn];
signed main()
{
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    sort(a+1,a+n+1);
    for(int i=1;i<=k;i++)
        ans+=a[n-i+1]-a[i];
    printf("%lld",ans);
    return 0;
}
posted @ 2019-10-25 20:41  Seaway-Fu  阅读(370)  评论(0)    收藏  举报