Pokemon题解
Pokemon
https://www.nowcoder.com/questionTerminal/a4cc4ef629f146f68c5d02e06dfd6b99
方法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;
}
};
查看14道真题和解析