[XUJCOJ] 2023天梯赛校内选拔赛
记录部分题目 8:常规赛排名 描述 一场常规赛需要参赛双方进行至多三局游戏来决出胜者(先赢两局者胜)。 赢得一场常规赛可以为战队获取 1 个场次分,输掉一场常规赛则无事发生。 同时,每赢得一局游戏可以为战队获取 1 个游戏分,输掉一局游戏则会失去 1 个游戏分。 例如 TeamA 和 TeamB 的游戏结果是 2:1,那么本场比赛结束后,TeamA 获得 1 个场次分和 1 个游戏分,TeamB 只失去 1 个游戏分。 具体排名规则如下: 优先按照场次分高低排名,场次分相同的,则按照游戏分从高到低排名,仍然相同的,则按照战队名称的字典序从小到大排。 输入 第一行是一个正整数 n 表示总共的常规赛场次。(1 ≤ n ≤ 105) 接下来 n 行,每行包含两个字符串和一个比分,表示参赛双方的战况。 战队名称仅包含大小写字母且长度不超过 10,比分只会是 0:2、1:2、2:1、2:0 中的一个。 输出 按排名规则的顺序输出若干行,每行包括:战队名 场次分 游戏分。 样例输入 3 TeamA TeamB 2:1 TeamB TeamC 2:0 TeamA TeamC 1:2 样例输出 TeamB 1 1 TeamA 1 0 TeamC 1 -1 思路 这是一道模拟题,需要模拟比赛过程并统计每个队伍的分数。我们可以使用一个unordered_map来存储每个队伍的信息,使用一个结构体Team来表示每个队伍的名称、场次分和游戏分。对于每一场比赛,我们可以解析输入并根据比分更新每个队伍的信息。如果某个队伍赢了比赛,它的场次分和游戏分都会增加;如果它输了比赛,则它的游戏分会减少。 一旦我们统计了每个队伍的分数,我们可以将它们放入一个vector中,并使用一个compare函数对它们进行排序,以便根据场次分、游戏分和队伍名称的字典序输出排名。最后,我们遍历排好序的vector并输出每个队伍的信息。 总之,这道题的思路比较简单,重点在于正确解析输入并更新每个队伍的信息。我们需要考虑所有可能的比分情况,并使用一个unordered_map来快速查找每个队伍的信息。 代码 #include <iostream> #include <vector> #include <string> #include <unordered_map> #include <algorithm> #include <sstream> using namespace std; struct Team { string name; int matches_won; int game_points; }; bool compare(const Team& a, const Team& b) { if (a.matches_won == b.matches_won) { if (a.game_points == b.game_points) { return a.name < b.name; } return a.game_points > b.game_points; } return a.matches_won > b.matches_won; } int main() { int n; cin >> n; cin.ignore(); unordered_map<string, Team> teams; for (int i = 0; i < n; ++i) { string line; getline(cin, line); istringstream iss(line); string team1, team2; char delimiter; int score1, score2; iss >> team1 >> team2 >> score1 >> delimiter >> score2; if (score1 > score2) { teams[team1].matches_won++; teams[team1].game_points += (score1 - score2); teams[team2].game_points -= (score1 - score2); } else { teams[team2].matches_won++; teams[team2].game_points += (score2 - score1); teams[team1].game_points -= (score2 - score1); } teams[team1].name = team1; teams[team2].name = team2; } vector<Team> team_list; for (const auto& team : teams) { team_list.push_back(team.second); } sort(team_list.begin(), team_list.end(), compare); for (const auto& team : team_list) { cout << team.name << " " << team.matches_won << " " << team.game_points << endl; } return 0; } 9:炉石传说-沉没之城 描述 小卢在玩某款卡牌游戏,每个回合中,他可以执行以下三种操作任意次。 ...