WA on #12 #13
思路同顶楼题解,有能量就用能量,其中两只怪以上或 两只怪及以下且有一只怪1血就用群伤,否则天音波。没能量就普攻。先打血少。
实现有点沟槽,细节够多了
大概是用 l 记录杀怪数,tot 记录群伤累计伤害,将多次效果相同的攻击压缩
#include <bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f
#define INFF 1e18
#define endl '\n'
#define lson id << 1
#define rson id << 1 | 1
using namespace std;
const int N = 1e5 + 5;
int a[N];
int n, m;
signed main() {
// freopen("data.txt", "r", stdin);
// freopen("WA.txt", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= n; i ++) cin >> a[i];
sort(a + 1, a + n + 1);
int l = n, i = 1, tot = 0, ans = 0;
while (l > 0) {
if (m) {
if (l > 2 || (l <= 2 && a[i] == 1)) {
if (m >= a[i]) {
tot += a[i], m -= a[i], ans += a[i] * l, a[i] = 0;
int died = 0;
while (a[i] <= 0 && i <= n) l --, died ++, a[ ++ i] -= tot;
ans -= died;
} else tot += m, ans += m * l, a[i] -= m, m = 0;
} else {
if (m >= a[i] / 2) {
m -= a[i] / 2, ans += a[i] / 2 * l, a[i] %= 2;
if (!a[i]) ans --;
} else ans += a[i] * l, a[i] -= m * 2, m = 0;
}
} else {
ans += a[i] * l - 1, a[i] = 0;
}
while (a[i] <= 0 && i <= n) l --, a[ ++ i] -= tot;
}
cout << ans;
return 0;
}