2024年莆田市第四期C++专项第三轮选拔真题(初中组) 江湖 题解
解题思路
核心算法
-
战斗模拟:计算双方击败对方需要的攻击次数
-
属性分配:枚举所有可能的属性点分配方式
-
胜负判断:根据攻击次数和先攻优势决定胜负
关键点
-
速度决定先攻顺序
-
属性点可以自由分配为攻击或生命
-
需要找出是否存在至少一种分配方式使小P获胜
代码实现
#include <iostream>
using namespace std;
bool canWin(long long a1, long long h1, long long a2, long long h2, bool firstAttack) {
long long n1=h2%a1==0?h2/a1:h2/a1+1;
long long n2=h1%a2==0?h1/a2:h1/a2+1;
if(n1==n2){
if(firstAttack)return true;
else return false;
}else{
if(n1<n2)return true;
else return false;
}
}
int main() {
long long t;
cin >> t;
while (t--) {
long long ac, dc, vc; // 小P的属性
long long am, dm, vm; // 对手的属性
long long x, y, k; // 属性点参数
cin >> ac >> dc >> vc;
cin >> am >> dm >> vm;
cin >> x >> y >> k;
bool firstAttack = (vc > vm);
bool canWinBattle = false;
// 尝试所有可能的属性点分配
for (int i = 0; i <= k; i++) {
long long newAc = ac + i * x;
long long newDc = dc + (k - i) * y;
if (canWin(newAc, newDc, am, dm, firstAttack)) {
canWinBattle = true;
break;
}
}
cout << (canWinBattle ? 1 : 0) << endl;
}
return 0;
}