编程题#4: 魔兽世界终极版
注意: 总时间限制: 2000ms 内存限制: 65536kB
AC
(题干略)
#include<iostream>
#include<iomanip>
#include<map>
#include<set>
#include<string>
using namespace std;
class Headquarter {
public:
Headquarter() {
cityawardr = 0; cityawardb = 0; redtob = 0; bluetor = 0; }
int Mr, Mb, cityawardr, cityawardb, redtob, bluetor;
};
class warrior {
public:
warrior() {
info.step = 0; info.loyalty = 0; info.sword = 0; info.arrow = 0; info.bomb = 0; info.sq = 0.00;
}
struct Info{
int force, life, step, loyalty, sword, arrow, bomb;
double sq;
string name;
};
int n;
Info info;
};
class Binfo {
public:
int life, force;
};
class city {
public:
city() {
info.life = 0; info.red = 0, info.blue = 0, info.flagr = 0, info.flagb = 0; info.flag = '0'; }
struct Info {
int life, red, blue, flagr, flagb;
char flag;
};
int n;
Info info;
};
typedef map<int, warrior::Info> MAP;
typedef map<int, city::Info> CITY;
int main() {
int caseN; cin >> caseN; int ii = 0; if (caseN == 0) {
return 0; }
while (ii < caseN) {
++ii;
cout << "Case " << ii << ":" << endl;
int M, N, R, K, T; cin >> M >> N >> R >> K >> T; //life/city/arrow force/loyalty/time
if (T >= 0) {
Headquarter a; a.Mr = a.Mb = M;
int life[5] = {
0 }; int force[5] = {
0 }; string name[5] = {
"dragon", "ninja", "iceman", "lion", "wolf" };
for (int j = 0; j < 5; ++j) {
cin >> life[j]; } for (int j = 0; j < 5; ++j) {
cin >> force[j]; }
map<string, Binfo> mname; for (int j = 0; j < 5; ++j) {
Binfo info; info.force = force[j]; info.life = life[j]; mname.insert(make_pair(name[j], info));
}
MAP mr; MAP mb; MAP::iterator i; MAP::iterator temp;//insert warriors in map
int min = 0; int hour = 0; warrior redw; warrior bluew;
CITY acity; CITY::iterator icity; city aacity;
for (int j = 0; j < N; ++j) {
acity.insert(make_pair(j + 1, aacity.info)); } //initiate city
string redname[5] = {
"iceman", "lion", "wolf", "ninja", "dragon" }; string bluename[5] = {
"lion", "dragon", "ninja", "iceman", "wolf" }; //order to make warrior
int jr = 0, jb = 0, nr = 0, nb = 0; //index of array/sum of warriors
while (T >= 0) {
if (min == 0) {
// make warriors
if (jr == 5) {
jr = 0; } //jr is the index of array / nr is used as count
map<string, Binfo>::iterator ir = mname.find(redname[jr]); //redheadquarter
if (a.Mr >= ir->second.life) {
//if it is enough to make warrior
++nr;
redw.info.life = ir->second.life; redw.info.force = ir->second.force; redw.n = nr; a.Mr -= ir->second.life;
redw.info.step = 0; redw.info.loyalty = 0; redw.info.sword = 0; redw.info.arrow = 0; redw.info.bomb = 0; redw.info.sq = 0.00;
if (redname[jr] == "iceman" || redname[jr] == "dragon" || redname[jr] == "ninja") {
//they born with weapon
if (nr % 3 == 0) {
redw.info.sword = (int)(0.2*redw.info.force); }
else if (nr % 3 == 1) {
redw.info.bomb = 1; }
else if (nr % 3 == 2) {
redw.info.arrow = 3; }
if (redname[jr] == "ninja") {
redw.info.name = "ninja"; //ninja born with 2 weapons
if ((nr + 1) % 3 == 0) {
redw.info.sword = (int)(0.2*redw.info.force); }
else if ((nr + 1) % 3 == 1) {
redw.info.bomb = 1; }
else if ((nr + 1) % 3 == 2) {
redw.info.arrow = 3; }
cout << setfill('0') << setw(3) << hour << ":00 red ninja " << nr << " born" << endl;
}
else if (redname[jr] == "iceman") {
redw.info.name = "iceman";
cout << setfill('0') << setw(3) << hour << ":00 red iceman " << nr << " born" << endl;
}
else if (redname[jr] == "dragon") {
//dragon born with morale
redw.info.name = "dragon"; redw.info.sq = (double)a.Mr / (double)redw.info.life;
cout << setfill('0') << setw(3) << hour << ":00 red dragon " << nr << " born" << endl;
cout << "Its morale is " << fixed<<setprecision(2)<<redw.info.sq << endl;
}
}
else if (redname[jr] == "lion") {
//lion born with morale
redw.info.name = "lion"; redw.info.loyalty = a.Mr;
cout << setfill('0') << setw(3) << hour << ":00 red lion " << nr << " born" << endl;
cout << "Its loyalty is " << redw.info.loyalty << endl;
}
else if (redname[jr] == "wolf") {
redw.info.name = "wolf";
cout << setfill('0') << setw(3) << hour << ":00 red wolf " << nr << " born" << endl;
}
mr.insert(make_pair(redw.n, redw.info)); ++jr; //insert warriors in map
}
if (jb == 5) {
jb = 0; }
map<string, Binfo>::iterator ib = mname.find(bluename[jb]);
if (a.Mb >= ib->second.life) {
//blueheadquarter
++nb;
bluew.info.life = ib->second.life; bluew.info.force = ib->second.force; bluew.n = nb; a.Mb -= ib->second.life;
bluew.info.step = 0; bluew.info.loyalty = 0; bluew.info.sword = 0; bluew.info.arrow = 0; bluew.info.bomb = 0; bluew.info.sq = 0.00;
if (bluename[jb] == "iceman" || bluename[jb] == "dragon" || bluename[jb] == "ninja") {
if (nb % 3 == 0) {
bluew.info.sword = (int) (0.2*bluew.info.force); }
else if (nb % 3 == 1) {
bluew.info.bomb = 1; }
else if (nb % 3 == 2) {
bluew.info.arrow = 3; }
if (bluename[jb] == "ninja") {
bluew.info.name = "ninja";
if ((nb + 1) % 3 == 0) {
bluew.info.sword = (int)(0.2*bluew.info.force); }
else if ((nb + 1) % 3 == 1) {
bluew.info.bomb = 1; }
else if ((nb + 1) % 3 == 2) {
bluew.info.arrow = 3; }
cout << setfill('0') << setw(3) << hour << ":00 blue ninja " << nb << " born" << endl;
}
else if (bluename[jb] == "iceman") {
bluew.info.name = "iceman";
cout << setfill('0') << setw(3) << hour << ":00 blue iceman " << nb << " born" << endl;
}
else if (bluename[jb] == "dragon") {
bluew.info.name = "dragon";
bluew.info.sq = (double)a.Mb / (double)bluew.info.life;
cout << setfill('0') << setw(3) << hour << ":00 blue dragon " << nb << " born" << endl;
cout << "Its morale is " << fixed<< setprecision(2)<<bluew.info.sq << endl;
}
}
else if (bluename[jb] == "lion") {
bluew.info.name = "lion"; bluew.info.loyalty = a.Mb;
cout << setfill('0') << setw(3) << hour << ":00 blue lion " << nb << " born" << endl;
cout << "Its loyalty is " << bluew.info.loyalty << endl;
}
else if (bluename[jb] == "wolf") {
bluew.info.name = "wolf";
cout << setfill('0') << setw(3) << hour << ":00 blue wolf " << nb << " born" << endl;
}
mb.insert(make_pair(bluew.n, bluew.info)); ++jb;
}
}
T -= 5; if (T < 0) break; else min += 5;
if (min == 5) {
//lion ran away
if (mr.size() != 0) {
i = mr.end(); --i; //lion born with 0 loyalty would run away too
if (i->second.name == "lion" && i->second.loyalty <= 0 && i->second.step==0){
cout << setfill('0') << setw(3) << hour << ":05 red lion " << i->first << " ran away" << endl;
++i;
if (i != mr.end()) {
temp = i; --i; mr.erase(i); i = temp; }
else {
--i;
if (mr.size() == 1) {
mr.erase(i); }
else {
--i; temp = i; ++i; mr.erase(i); i = temp; }
}
}
}
MAP::iterator j; if (mb.size() != 0) {
j = mb.begin(); }
for (icity = acity.begin(); icity != acity.end(); ++icity) {
if (icity->second.blue != 0 || icity->second.red != 0) {
if (icity->second.red != 0) {
// the city has red warrior
while (i->second.step < icity->first && i!=mr.begin()) {
--i; }
if (i->second.step == icity->first && i->second.name == "lion" && i->second.loyalty <= 0 ) {
cout << setfill('0') << setw(3) << hour << ":05 red lion " << i->first << " ran away" << endl;
++i;
if (i != mr.end()) {
temp = i; --i; mr.erase(i); i = temp; }
else {
--i;
if (mr.size() == 1) {
mr.erase(i); }
else {
--i; temp = i; ++i; mr.erase(i); i = temp; }
}
icity->second.red -= 1;
}
}
if (icity->second.blue != 0) {
while (N + 1 - j->second.step < icity->first && j != mb.end()) {
++j; }
if (j == mb.end()) {
--j; }
if (N + 1 - j->second.step == icity->first && j->second.name == "lion" && j->second.loyalty <= 0) {
cout << setfill('0') << setw(3) << hour << ":05 blue lion " << j->first << " ran away"