1.题目:N国举行一年一度的足球比赛。来自不同地区的16只队伍分成A、B、C、D 4个小组,每个小组4只队伍。同一小组的队伍两两之间会进行比赛,请输出每个小组的最终排名。
其中积分规则为:
(1)如果A战胜B,则A积3分,B积0分;
(2)如果A和B结果为平局,则双方各得一分。
排名规则如下,按照以下顺序依次比较确定排名的先后:
(1)积分高的队伍靠前
(2)总净胜球(总进球数-总失球数)多的队伍排名靠前
(3)总进球数多的队伍排名靠前
(4)字母序小者排名靠前
输入描述:
每个数据依次给出A、B、C、D 4个小组的比赛信息。每6行表示一个小组的比赛信息。最开始的6行表示A组的6场比赛信息,依次是B、C、D 三个小组的比赛信息。每组比赛信息自间有一个空行
比赛信息的格式为“teamA numA:numB teamB”,表示teamA和teamB比赛的结果为numA:numB。teamA和teamB均用3个大写字母表示,numA和numB的范围为[0...9]。保证所有数据合法
输出描述:
依次输出A、B、C、D 4个小组的最终排名情况。每个小组输出1行,包括4个队伍的名称,表示该小组的最终排名。队伍之间有一个空格,行末无空格。
输入:
MAN 0:0 JUV MAN 1:1 MAD MAN 2:2 BAR JUV 2:2 MAD JUV 3:3 BAR BAR 1:1 MAD AAA 2:1 BBB AAA 3:0 CCC AAA 5:0 DDD BBB 1:1 CCC BBB 2:2 DDD CCC 4:4 DDD ABC 2:1 DEF ABC 3:0 GHI ABC 0:2 JKL DEF 3:2 GHI DEF 3:1 JKL GHI 0:5 JKL XYZ 2:1 UVW XYZ 3:0 OPQ XYZ 0:2 LMN UVW 3:2 OPQ UVW 3:1 LMN OPQ 0:5 LMN
输出:
BAR JUV MAD MAN AAA BBB CCC DDD JKL DEF ABC GHI LMN UVW XYZ OPQ
解题思路:采用结构体存Team储一支队伍的各个数据,利用unordered_map存放队伍,将队伍名作为key值,将Team作为value,由于unordered_map不能使用sort排序,因此将Team存放到vector中,利用myCompare进行排序。
程序:
#include<iostream> #include<unordered_map> #include<string> #include<vector> #include<algorithm> #include<iterator> using namespace std; struct Team { int score; int dif ; int total; int get; int lose; string name; Team(string str,int g,int k) :name(str),get(g),lose(k) { if (get > lose) score = 3; if (get == lose) score = 1; if (get < lose) score = 0; dif = g - k; total = g; }; Team() = default; Team operator+=(Team &a) { if(a.get>a.lose) score += a.score; dif += a.dif; total += a.total; return *this; } }; bool myCompare(const Team& t1,const Team& t2) { if (t1.score > t2.score) return true; else if (t1.score == t2.score&&t1.dif > t2.dif) return true; else if (t1.score == t2.score&&t1.dif == t2.dif&&t1.total > t2.total) return true; else if (t1.score == t2.score&&t1.dif == t2.dif&&t1.total == t2.total&&t1.name < t2.name) return true; else return false; } int main() { for (int j = 0; j < 4; ++j) { string str1; string str2; int score1, score2; unordered_map<string, Team> mp; for (int i = 0; i < 6; ++i) { cin >> str1; cin >> score1; getchar(); cin >> score2; cin >> str2; Team t1(str1, score1, score2); Team t2(str2, score2, score1); auto found = mp.find(str1); if (found != mp.end()) { found->second += t1; } else { mp[str1] = t1; } auto found1 = mp.find(str2); if (found1 != mp.end()) { found1->second += t2; } else { mp[str2] = t2; } } vector<Team> vc; //方法一 /* unordered_map<string, Team>::iterator it = mp.begin(); while (it != mp.end()) { vc.push_back(it->second); it++; }*/ //方法二 for (auto &m : mp) { vc.push_back(m.second); } sort(vc.begin(), vc.end(), myCompare); for (int i = 0; i != vc.size(); ++i) { cout << vc[i].name << " "; } cout << endl; } return 0; }
上面的方法中用到的是自定义的比较函数myCompare,另外一种方法就是使用函数对象,什么是函数对象?就是定义了函数调用操作符()的类的对象。
class Mycomp{ public: bool operator()( Team &t1 , Team &t2) { if (t1.score > t2.score) return true; else if (t1.score == t2.score&&t1.dif > t2.dif) return true; else if (t1.score == t2.score&&t1.dif == t2.dif&&t1.total > t1.total) return true; else if (t1.score == t2.score&&t1.dif == t2.dif&&t1.total == t1.total&&t1.name < t2.name) return true; else return false; } };
在排序时使用方法
sort(vc.begin(), vc.end(), Mycomp());