题面:https://codefun2000.com/p/P1433
#include "bits/stdc++.h"
using namespace std;
long long calcu(vector<long long> a, bool lowToHigh)
{
int n = a.size() - 1;
if (lowToHigh)
sort(a.begin() + 1, a.end());
else
sort(a.begin() + 1, a.end(), greater()); // 降序
long long ans = 0;
// 把打到一半血需要的次数理解为:
// 扣掉一半血,再扣掉 其他怪触发的debuff扣的血 之后,
// 打到0血还需要几次
for (int i = 1; i <= n; i++)
{
int d = i - 1; //之前的怪能触发几次debuff
//算上前面的怪触发的debuff 已经打掉了多少血
long long losedHp = min(a[i], a[i] / 2 + d);
ans += a[i] - losedHp; //还需要打多少血
if (losedHp - n > 0)
ans += losedHp - n; //如果所有敌人都触发1次之后还有血
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
vector<long long> a(n + 1);
long long i;
for (i = 1; i <= n; i++)
cin >> a[i];
// 从小打到大 与 从大打到小 取较小者
cout << min(calcu(a,false), calcu(a, true));
return 0;
}