我们先把w这个数组从小到大排序,然后给a数组从大到小排序,给w=1分配a最大的,因为w=1最大的会翻倍,给完了再给w从大到小排序(注意把1都去掉),然后把当前最大的那个和wi剩下最小的分配第i个人,这样是最优的。一开始并没有把w从大到小排序,直接分,wa2,最后发现,没有从大到小那次排序,中间那一部分比较大的都不会贡献进答案,还不如把小一点的都排除掉,不是很懂的就看代码和自己想一下。
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#define int long long
using namespace std;
int n,t,ans,tail,head,w[200005],a[200005],k;
bool cmp(int x,int y)
{
return x>y;
}
signed main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
ans=0;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=k;i++)
{
cin>>w[i];
}
sort(w+1,w+k+1);
sort(a+1,a+n+1,cmp);
head=1,tail=n;
int pos=k+1;
for(int i=1;i<=k;i++)
{
if(w[i]==1)
{
ans+=a[head]*2;
head++;
}
else
{
pos=i;
break;
}
}
sort(w+pos,w+k+1,cmp);
for(int i=pos;i<=k;i++)
{
ans+=a[head];
ans+=a[tail];
w[i]-=2;
head++,tail--;
for(int j=1;j<=w[i];j++)tail--;
}
cout<<ans<<endl;
}
}