题解:CF1805F1 Survival of the Weakest (easy version)
首先考虑最小的
这样单次是
但是,最坏情况下做一次值翻倍,做
接着我们在计算每轮减去的
Code
#include <bits/stdc++.h>
#define Pii pair <int, int>
#define int long long
using namespace std;
const int N = 3e3 + 5, Mod = 1e9 + 7;
int n, pos[N], pw[N];
vector <int> arr, Fmin;
priority_queue < Pii, vector <Pii>, greater <Pii> > q;
vector <int> solve(vector <int> arr) {
int n = arr.size();
for (int i = 0; i < n - 1; ++i) pos[i] = i + 1, q.emplace(arr[i] + arr[i + 1], i);
vector <int> ary;
while(q.size()) {
Pii u = q.top(); q.pop();
ary.push_back(u.first);
if(ary.size() == n - 1) break;
int i = u.second; ++ pos[i];
if(pos[i] < n) q.emplace(arr[i] + arr[pos[i]], i);
}
Fmin.push_back(ary.front());
for (int& x : ary) x -= Fmin.back();
while(q.size()) q.pop();
return ary;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
cin >> n, arr.resize(n);
for (int& x : arr) cin >> x;
sort(arr.begin(), arr.end());
Fmin.push_back(arr.front());
for (int& x : arr) x -= Fmin.back();
for (int i = 1; i < n; ++i) arr = solve(arr);
int ans = 0; pw[0] = 1;
for (int i = 1; i <= n; ++i) pw[i] = pw[i - 1] * 2 % Mod;
for (int i = 0; i < Fmin.size(); ++i) ans = (ans + pw[n - i - 1] * Fmin[i] % Mod) % Mod;
cout << ans << '\n';
return 0;
}