CF1369C-RationalLee【贪心】

题目:

(n) 个整数,将其分配给 (k) 个人,每个人要求获得的数的个数为 (w[i]),每个人的幸福值为受的数的最大值和最小值之和。求所有人幸福值的和的最大值。
(1≤n≤2⋅10^5,1≤k≤n,−10^9≤a_i≤10^9,1≤w_i≤n,w_1+w_2+…+w_k=n)

分析:

首先对于只要一个数的人,应该尽可能把大的数分给他们,这样可以使得他们的幸福值最大。
而对于其他人的最大值,肯定是尽可能大,即每个人的最大值的和是确定的。那么,就要使得每个人的最小值尽可能的大。因此,对于要求数的个数多的人而言,让他的最小值尽可能向小的方向移动。那么,整体的最小值就可以尽可能的向大的方向移动。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int a[N],w[N];
int main()
{
    int t,n,k;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=k;i++)
            scanf("%d",&w[i]);
        sort(a+1,a+1+n);
        sort(w+1,w+1+k);
        int cnt=1;
        ll ans=0;
        while(w[cnt]==1)
        {
            ans+=2LL*a[n];
            n--,cnt++;
        }
        int l=1,r=n;
        while(k>=cnt)
        {
            ans+=(a[l]+a[r]);
            l+=(w[k]-1);
            r--,k--;
        }
        printf("%lld
",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/1024-xzx/p/13192198.html