网易笔试的一题。。。
小明做了一个简易的魔塔游戏。 在小明的设计中,主角和怪物都有攻击力防御力和生命值三个属性。一共有n个怪物,且主角与怪物战斗的顺序是固定的。每场都要主角先手,双方轮流攻击,实际照成的伤害等于攻击力减去对方的防御力,(伤害小于零按零计算),直到一方的生命值归零之后战斗结束。另外,主角还有一个被动技: 【回复】在主角发动攻击时,如果上海值大于敌人剩余的生命值,那么溢出的伤害会为自己回复等量的生命。 在整个过程中,如果主角生命值变为零,会立即死亡,挑战失败。请问主角初始生命值至少为多少,才能通关。
输入: 第一行为一个整数t,表示数据组数。 对于接下来的每组,第一行为一个正整数n,表示怪物的数量。 第二行为两个整数a和b,表示主角的攻击力和防御力。 接下来n行,每行三个整数ai,bi和hi,表示第i的怪物的攻击防御生命值。
输出: 对于每组数据,输出一行一个正整数表示主角能保证通关的最小初始生命值,如果主角无论如何也不能通关,则输出-1。
#include<iostream>
#include<vector>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int a, b;
cin >> a >> b;
vector<int> monster;
vector<vector<int>> monsters;
for (int i = 0; i < n; ++i) {
int ai, bi, hi;
cin >> ai >> bi >> hi;
monster.clear();
monster.push_back(ai);
monster.push_back(bi);
monster.push_back(hi);
monsters.push_back(monster);
}
int minh = 1000;
int h = 0;
int flag = 0;
for (int i = 0; i < n; ++i) {
int sh1 = (a - monsters[i][1]) > 0 ? (a - monsters[i][1]) : 0;
cout << "sh1 " << sh1 << endl;
if (sh1 == 0) {
flag = 1;
cout << -1 << endl;
break;
}
int sh2 = (monsters[i][0] - b) > 0 ? (monsters[i][0] - b) : 0;
cout << "sh2 " << sh2 << endl;
while (1) {
int hf = (sh1 - monsters[i][2]) > 0 ? (sh1 - monsters[i][2]) : 0;
h += hf;
if (minh > h)minh = h;
monsters[i][2] -= sh1;
if (monsters[i][2] <= 0) break;
h -= sh2;
if (minh > h)minh = h;
cout << h << endl;
}
}
if(!flag) cout << -minh+1 << endl;
}
system("pause");
return 0;
}
|