算法
(贪心+排序) $O(nlogn)$
我们可以先给待分配的数字按从大到小排序,然后分别把前$k$大的数字分配给这$k$个朋友,每人一个,同时$w[i]$要减掉一个$1$,然后再对$w$数组从小到大排序,把前$w[1]-1$个数分给朋友$1$,下一个$w[2]-1$个数分配给朋友$2$,等等。
C++ 代码
#include <iostream>
#include <vector>
#include <algorithm>
#define int long long
using namespace std;
signed main() {
int t;
cin >> t;
while (t--) {
int n, k;
cin >> n >> k;
vector<int> a(n);
for (int i = 0; i < n; ++i) cin >> a[i];
sort(a.rbegin(), a.rend());
vector<int> w(k);
int ans = 0;
for (int i = 0; i < k; ++i) {
cin >> w[i];
w[i]--;
ans += a[i];
}
sort(w.begin(), w.end());
int j = k - 1;
for (int i = 0; i < k; ++i) {
if (!w[i]) {
ans += a[i];
continue;
}
j += w[i];
ans += a[j];
}
cout << ans << '\n';
}
return 0;
}