zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
  • 相关阅读:
    CF1270H
    CF1305G
    LeetCode-Sqrt(x)
    LeetCode-Plus One
    LeetCode-Integer to Roman
    LeetCode-Roman to Integer
    LeetCode-String to Integer (atoi)
    LeetCode-Reverse Integer
    C++
    LeetCode-Gray Code
  • 原文地址:https://www.cnblogs.com/1024-xzx/p/13192198.html
Copyright © 2011-2022 走看看