码迷,mamicode.com
首页 > 其他好文 > 详细

CF1369C-RationalLee【贪心】

时间:2020-06-25 17:27:51      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:typedef   lan   include   幸福   ++   return   pac   获得   整数   

题目:

\(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\n",ans);
    }
    return 0;
}

CF1369C-RationalLee【贪心】

标签:typedef   lan   include   幸福   ++   return   pac   获得   整数   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!