Untitled
unknown
plain_text
2 years ago
2.1 kB
7
Indexable
#include <list>
using namespace std;
#define MAX_SOLDIERS 200002
#define MAX_TEAMS 6
#define MAX_SCORE 6
struct soldier {
int Id;
int team;
bool isFired;
void init(int Id, int team, bool isFired) {
this->Id = Id; // this đươc dùng trỏ cụ thể trong struct hoặc class
this->team = team;
this->isFired = isFired;
}
} Soldiers[MAX_SOLDIERS];
int index;
list <int> teams[MAX_TEAMS][MAX_SCORE];
int Id_to_Index[MAX_SOLDIERS];
void init()
{
index = 0;
for (int i = 0; i < MAX_TEAMS; i++) {
for (int j = 0; j < MAX_SCORE; j++) {
teams[i][j].clear();
}
}
}
void hire(int mID, int mTeam, int mScore)
{
index++;
Soldiers[index].init(mID, mTeam, false);
teams[mTeam][mScore].push_back(index);
Id_to_Index[mID] = index;
}
void fire(int mID)
{
Soldiers[Id_to_Index[mID]].isFired = true;
}
void updateSoldier(int mID, int mScore)
{
int team = Soldiers[Id_to_Index[mID]].team;
fire(mID);
hire(mID, team, mScore);
}
void updateScore(int mTeam, int mScore, int mChangeScore)
{
int newScore = mScore + mChangeScore;
if (newScore <= 1) newScore = 1;
if (newScore >= 5) newScore = 5;
teams[mTeam][newScore].splice(teams[mTeam][newScore].end(), teams[mTeam][mScore]);
}
void updateTeam(int mTeam, int mChangeScore)
{
if (mChangeScore == 0) return;
if (mChangeScore > 0) {
for (int i = 4; i >= 0; i--) {
updateScore(mTeam, i, mChangeScore);
}
}
else {
for (int i = 1; i <= 5; i++) {
updateScore(mTeam, i, mChangeScore);
}
}
}
int bestSoldier(int mTeam)
{
int res = -1;
for (int i = 5; i >= 0; i--) {
for (int it : teams[mTeam][i]) {
if (Soldiers[it].isFired == false && Soldiers[it].Id > res) {
res = Soldiers[it].Id;
}
}
if (res != -1) return res;
}
return res;
}Editor is loading...
Leave a Comment