标签: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;
}
标签:typedef lan include 幸福 ++ return pac 获得 整数
原文地址:https://www.cnblogs.com/1024-xzx/p/13192198.html