题目描述:
假定一款游戏中,有A,B两角色单挑对决。每次A先攻击B,造成A具有的攻击力的伤害值。然后B攻击A,同样,造成B具有的攻击力的伤害值。重复这一过程,直到有一方血量降为0或以下。如果A能打赢B,则输出获胜后A的血量,否则输出0。
输入:
第一行为A的血量和攻击力值
第二行为B的血量和攻击力值
输出:
输出仅一行,表示A剩下的血量,若A被打死则为0
样例输入:
100 9
100 8
样例输出:
12
#include <iostream>
int main () {
int aHealth, aHit;
int bHealth, bHit;
cin >>aHealth >> aHit >> bHealth >> bHit
while(true) {
bHealth -= aHit;
if (bHealth <= 0) {
break;
}
aHealth -= bHit;
if(aHealth <= 0) {
break;
}
}
cout << (aHealth > 0 ? aHealth : 0);
}
这是一个O(1)的解法:
#include <iostream>
#define DEBUG
using namespace std;
int main(void)
{
// A的血量 A的攻击力值 B的血量 B的攻击力值
int a, b, c, d;
cin >> a >> b >> c >> d;
// (a / d) 为A最多受B的伤害次数
// (c / b) 为B最多受A的伤害次数
// 如果前者大于等于后者,A先攻击B, A可以战胜后者
if ((a / d) >= (c / b))
{
// 最后剩余血量就等于(A的初始血量 - B最多打掉A的血量)
cout << a - ((c / b) * d) << endl;
}
else // A不能战胜后者
cout << 0 << endl;
return 0;
}
关于比较血量的解释:
只能说是歪打正着了,虽然计算伤害次数会忽略掉剩余的残血,导致按这个次数算下来A,B双方最后可能都还有血量。不过由于A先手,所以A可以一击打败B,B血量降到0或0以下,无法反击。所以最终B对A造成的伤害次数仍然是B最多整数承伤次数(B的血量整除下取整A的攻击值)。
望采纳,谢谢!
其实答案差不多。楼上的就很好了
#include <iostream>
using namespace std;
int main(){
int aHealth, aHit;
int bHealth, bHit;
cin >>aHealth >> aHit >> bHealth >> bHit;
do{
bHealth -= aHit;
if(bHealth <= 0) break;
aHealth -= bHit;
if(aHealth <= 0) break;
}while(aHealth > 0 && bHealth > 0);
cout << (aHealth > 0 ? aHealth : 0);
return 0;
}
#include<iostream>
using namespace std;
int min(int a, int b) { return a < b ? a : b; }
int main() {
int aHealth=0, aHit=0, bHealth=0, bHit=0;
cin>> aHealth >> aHit>>bHealth>> bHit;
int aTime, bTime;
aTime = aHealth / bHit;//a存活时间
bTime = bHealth / aHit;//b存活时间
int together = min(aTime, bTime);
int aRemain = aHealth - together * bHit,//剩余血
bRemain = bHealth - together * aHit;
if (aRemain == 0 && bRemain == 0) {//经过同次数时,都减为0
cout << aRemain + bHit << endl;
}
else if (aRemain == 0) {
cout << 0 << endl;
}
else if (bRemain == 0) {
cout << aRemain << endl;
}
else{
bRemain -= aHit;
if (bRemain <= 0) {
cout << aRemain << endl;
return 0;
}
aRemain -= bHit;
if (aRemain <= 0) {
cout << 0 << endl;
return 0;
}
}
}