Codeforces Round#652(Div.2)C.RationalLee(欲張り)
3128 ワード
タイトルリンク:https://codeforces.com/contest/1369/problem/C
に言及
$n$の個数を$k$個人に分け、一人当たり$w_を分けます.i$個数($sum_{i=1}^{k}w_i=n$)は、それぞれの人の快楽値が数の最小値と最大値の和に分けられ、すべての人の快楽値の和の最大値が計算される.
問題解
$n$の個数を小さいものから大きいものに並べ替えて両側から加算し、大きな$w_を利用するi$はできるだけ小さな値をスキップします.
コード#コード#
に言及
$n$の個数を$k$個人に分け、一人当たり$w_を分けます.i$個数($sum_{i=1}^{k}w_i=n$)は、それぞれの人の快楽値が数の最小値と最大値の和に分けられ、すべての人の快楽値の和の最大値が計算される.
問題解
$n$の個数を小さいものから大きいものに並べ替えて両側から加算し、大きな$w_を利用するi$はできるだけ小さな値をスキップします.
コード#コード#
#include
using ll = long long;
using namespace std;
void solve() {
int n, k; cin >> n >> k;
int a[n] = {};
for (int i = 0; i < n; i++)
cin >> a[i];
int w[k] = {};
for (int i = 0; i < k; i++)
cin >> w[i];
sort(a, a + n);
sort(w, w + k, greater<int>());
ll ans = 0;
int l = 0, r = n - k;
for (int i = 0; i < k; i++) {
if (w[i] == 1) {
ans += a[r] + a[r];
++r;
} else {
ans += a[l++] + a[r++];
l += w[i] - 2; //
}
}
cout << ans << "
";
}
int main() {
int t; cin >> t;
while (t--) solve();
}