传送门:CCF201609-3 炉石传说
很暴力的模拟题。就按照题目要求一顿瞎几把模拟就好了。
唯一要注意的点就是,如果一方攻击对方的英雄,并且导致英雄死亡,如果不加处理,会导致越界,即随从本来只能在1-7位,越界到0位英雄位上了。博主就因为疏忽了这个,第一发只拿了70分。
下面是AC代码:
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
struct Minion
{
int ak, hp;
Minion() {}
Minion(int AK, int HP): ak(AK), hp(HP) {}
}f[2][8];
void init()
{
for(int i = 0; i < 2; ++i)
{
f[i][0] = Minion(0, 30);
for(int j = 1; j <= 7; ++j)
f[i][j] = Minion(0, 0);
}
}
void dead(int turn, int pos)
{
if(!pos) //防止越界,很重要,没有这条语句只有70分
return;
f[turn][pos] = Minion(0, 0);
for(int i = pos; i < 7; ++i)
f[turn][i] = f[turn][i+1];
f[turn][7] = Minion(0, 0);
}
void read()
{
int T;
cin >> T;
int turn = 0;
while(T--)
{
string action;
cin >> action;
if(action == "summon")
{
int pos, ak, hp;
cin >> pos >> ak >> hp;
if(f[turn][pos].hp)
for(int i = 7; i > pos; --i)
f[turn][i] = f[turn][i-1];
f[turn][pos] = Minion(ak, hp);
}
else if(action == "attack")
{
int atk, dfd;
cin >> atk >> dfd;
f[turn][atk].hp -= f[!turn][dfd].ak;
f[!turn][dfd].hp -= f[turn][atk].ak;
if(f[turn][atk].hp <= 0)
dead(turn, atk);
if(f[!turn][dfd].hp <= 0)
dead(!turn, dfd);
}
else if(action == "end")
turn = !turn;
}
}
void solve()
{
int winner = 0;
if(f[0][0].hp <= 0)
winner = -1;
if(f[1][0].hp <= 0)
winner = 1;
cout << winner << '\n';
for(int i = 0; i < 2; ++i)
{
cout << f[i][0].hp << '\n';
int cnt = 0;
vector <int> ans;
for(int j = 1; j <= 7; ++j)
if(f[i][j].hp > 0)
{
cnt++;
ans.push_back(f[i][j].hp);
}
cout << cnt;
for(int j = 0; j < ans.size(); ++j)
cout << ' ' << ans[j];
cout << '\n';
}
}
int main()
{
init();
read();
solve();
return 0;
}