• 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;
    }
    
    
  • 相关阅读:
    [hdu4035]maze
    [codeforce][148d]
    [bzoj3507]通配符匹配
    [BZOJ4831]
    子串
    【洛谷1373】小a和uim之大逃离
    【JZOJ6303】演员
    [jzoj6296]选票
    字符串哈希
    [ABC137d&e]RE
  • 原文地址:https://www.cnblogs.com/1024-xzx/p/13192198.html
Copyright © 2020-2023  润新知