链接:Problem - 1369C - Codeforces
思路:当该人仅分配1个数时要选取当前最大数,使最大数可以被加2次;其余的按照分配数从大到小枚举,每次选取当前最大数,其他选取当前最小数。
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,t,k,l,r,q,p,x,idx,res,cnt,sum,flag,maxx,minn;
const int N=200010;
const int MOD=1e9+7;
const int INF=0x3f3f3f3f3f3f3f3f;
int a[N],b[N];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>t;
while(t--){
cin>>n>>k;
cnt=0;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<k;i++){
cin>>b[i];
if(b[i]==1){
cnt++;
}
}
sort(a,a+n);
sort(b,b+k);
reverse(b,b+k);
sum=0;
for(int i=n-1;i>n-1-cnt;i--){
sum+=a[i]*2;
}
int l=0,r=n-1-cnt;
for(int i=0;i<k-cnt;i++){
sum+=a[r];
sum+=a[l];
r--;
for(int j=0;j<b[i]-1;j++){
l++;
}
}
cout<<sum<<'\n';
}
return 0;
}