题目要求满足条件的最小回合数,可以使用二分来求解

  • 在x回合内,首先进行整体攻击(小红),然后再进行双消(队友1),最后统计剩余总血量,进行单体攻击(队友2)和无法双消剩下的攻击(队友1),比较是否可以消除完剩余血量
#include <bits/stdc++.h>
using namespace std;
long long n, a[100010], ans, Max = -1;
bool round(int x) {//进行的回合数
    long long temp[100005];
    for (int i = 1; i <= n; i++) {
        temp[i] = a[i] - x;//整体攻击(小红)
    }

    long long cnt = 0, sum = 0;
    for (int i = 1; i < n; i++) {//双消部分(队友1)
        if (temp[i] > 0 && temp[i + 1] > 0) {
            cnt += min(temp[i], temp[i + 1]);//可以双消的次数
            int tmp = min(temp[i], temp[i + 1]);
            temp[i] -= tmp;//双消后的值
            temp[i + 1] -= tmp;
        }
		if(cnt>=x) break;// 双消次数不能大于回合数
    }
    for (int i = 1; i < n; i++) {
        if (temp[i] > 0)
            sum += temp[i];//剩余怪的血量
    }
    return sum <= 2 * x - cnt;//如果剩下的血量能被打完,就返回1,否则返回0
    	//x为回合数,x为队友1能造成单击伤害,x-cnt表示(没有双消目标)后进行的攻击伤害
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (a[i] > Max) {
             Max = a[i];//找到血量最大值
        }
    }

    int l = 0, r = Max;
    while (l <= r) {
        int mid = (l + r) / 2;
        if (round(mid)) {
            r = mid - 1;//满足,则看看更小的回合可不可以
            ans = mid;
        } else {
            l = mid + 1;//不满足,则看看更大的回合
        }
    }//直到确定最小回合数

    cout << ans;
    return 0;
}