题意:
牛牛是励志成为世界第一宝可梦大师的宝可梦训练家。现在他遇到了一个强劲的野生宝皮卡丘,野生宝皮卡丘的生命值是HP,攻击力是ACK,牛牛召唤的宝可梦是杰尼龟。杰尼龟的生命值是HP2,攻击力是ACK2,除此之外身为训练家还可以给宝可梦吃药让他满血复活(吃药发生在双方发动攻击之前,并且吃药一方不得在本回合发动攻击)。牛牛想知道他最少多少回合才能能打败野生宝皮卡丘?因为皮卡丘会电光一闪,所以皮卡丘总是比杰尼龟先发动攻击。如果牛牛无法战胜野生皮卡丘则返回-1。
输入:
包括HP ACK HP2 ACK2 1<HP,ACK,HP2,ACK2< 1012, 1≤HP,ACK,HP2,ACK2≤1012
输出:
若能成功击败野生皮卡丘则返回最少回合数,否则返回-1。
输入
复制
8,3,8,1
输出
复制
14
说明
至少需要14回合战胜野生皮卡丘
示例2
输入
复制
1,1,1,1
输出
复制
-1
说明
皮卡丘先出招就直接打死了杰尼龟,所以无法获胜
long long Pokemonfight(long long HP, long long ACK, long long HP2, long long ACK2) {
long long res1=0;
long long res2=0;
long long res3=0;
//判断是否杰尼龟是否一下子就死 例子2 4 4 2
if(HP2<=ACK)
return -1;
// 由上面知杰尼龟未一下子死.则判断是否杰尼龟一下子皮卡丘死
//例子 4,2 4,4
if(HP<=ACK2)
return 1;
//由上面知,两个不会一下子死.则若杰尼龟的血量小于皮卡丘的攻击 则会不断的补血 从而不会攻击皮卡丘.
if(HP2 <=2*ACK)
return -1;
//杰尼龟 必须要攻击这么多下.向上取整
res1 = HP / ACK2;
if(HP%ACK2!=0)
res1+=1;
//由于杰尼龟补血的时机必须多承受一回合的攻击并且还需要有多余的血量.
//例子8 3 8 1 则当血量为5时的第二回合必须回血
res2 = (HP2-ACK)/ACK;
if(HP2%ACK==0)
res2-=1;
//若承受的伤害小于必要攻击的血量 则会在攻击完后还有剩余血量
if(res1<res2+1)
res3=0;
else{
//攻击的最后一回合必须攻击后打死
//则需要第一次补血时的,还剩余必须的攻击次数
//向上取整
res3 = (res1-res2-1)/res2;
if((res1-res2-1)%res2!=0)
res3+=1;
}
return res1+res3;
}