方法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; } };