方法1:AC
需要吃药的时候肯定是撑不住的那一回合,所以我们需要计算他需要吃多少次药,然后才能战胜野生皮卡丘,此题细节较多。特别需要注意杰尼龟可能第一回合打不过皮卡丘,或者杰尼龟可以直接打死皮卡丘的情况,杰尼龟在第二回合就被打死的情况。时间复杂度,空间复杂度

class Solution {
public:
    /**
     * 
     * @param HP long长整型 HP
     * @param ACK long长整型 ACK
     * @param HP2 long长整型 HP2
     * @param ACK2 long长整型 ACK2
     * @return long长整型
     */
    long long Pokemonfight(long long HP, long long ACK, long long HP2, long long ACK2) {
        // write code here
        typedef long long ll;
        if(ACK>=HP2||(ACK*2>=HP2&&ACK2<HP)) {
            return -1;
        }
        if(ACK2>=HP) {
            return 1;
        }
        ll ans=1;//提前处理第一回合,因为之后靠喝药剩下的血量都只有HP2-ACK
        HP=max(0ll,HP-ACK2);
        ll times=(HP2-ACK)/ACK;//不吃血包能攻击的回合数
        if((HP2-ACK)%ACK!=0) times++;
        times--;//最后一回合需要喝药保命
        ll allack;
        long double x=1;
        if(x*times*ACK2>=1e18) allack=1e18;
        else allack=times*ACK2;
        //计算完整吃血回合数
        ll fight=HP/allack;
        if(HP!=0&&HP%allack==0) ans--;
        ll lef=HP-fight*allack;
        ans+=fight*(times+1);
        ans+=lef/ACK2;
        if(lef%ACK2!=0) ans++;
        return ans;
    }
};

方法2:TLE
暴力模拟,每次要是这回合不被打死就继续战斗,要被打死就喝药

class Solution {
public:
    /**
     * 
     * @param HP long长整型 HP
     * @param ACK long长整型 ACK
     * @param HP2 long长整型 HP2
     * @param ACK2 long长整型 ACK2
     * @return long长整型
     */
    long long Pokemonfight(long long HP, long long ACK, long long HP2, long long ACK2) {
        // write code here
        typedef long long ll;
        if(ACK>=HP2||(ACK*2>=HP2&&ACK2<HP)) {
            return -1;
        }
        if(ACK2>=HP) {
            return 1;
        }
        ll tot=0;
        ll nowHP=HP2;
        while(HP>0) {
            tot++;
            if(nowHP>ACK) nowHP-=ACK,HP-=ACK2;
            else nowHP=HP2-ACK;
        }
        return tot;
    }
};