这下我真没辙了
查看原帖
这下我真没辙了
453555
qW__Wp楼主2025/7/23 17:28

评测记录

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;
}
2025/7/23 17:28
加载中...