题目描述:足球比赛的积分排名,一共16支球队,分为4组,每组4支球队,小组赛实行单循环制,每组一共进行6场比赛,胜者积3分,负者0分,打成平局各得一分,积分相同看净胜球数,净胜球多的排名靠前,净胜球数相同看总进球数,总进球数多的排名靠前,总进球数也相同的球队,名称的字母序小的排在前面。
输入描述:每个数据依次给出A,B,C,D四个小组的比赛信息。每6行表示一个小组的比赛信息,最开始的6行表示A组的6场比赛结果,然后依次是B组,C组,D组的比赛结果,每组比赛信息之间有一个空行。比赛信息的格式是“teamA numA:numB teamB”表示teamA和teamB进行比赛,比赛结果是numA:numB, numA和numB的范围是【0,9】,teamA和teamB均是三个大写字母表示,保证所有数据是合法的。
输出描述:依次输入A,B,C,D四个小组的最终排名情况。每个小组输出一行,包含4个队伍的名称,表示该小组的最终排名。队伍名称之间有一个空格,行末无空格。
题目分析:此题是考察候选者语言和语法的综合编程能力,涉及到的算法很简单,难点在于输入格式和输出格式必须符合题目要求,对于数据结构的使用必须合理得当,是一道考察考生基本编程功底的好题目,有区分度。
以下是本人用C++写的题目答案,仅供参考。在VS2013下调试运行成功,测试用例都有完全符合。
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
//球队结构体
struct team
{
string name; //球队名称
int goalCount = 0; //球队总进球数
int goalDiff = 0; //球队净胜球数
int grade = 0; //球队总积分
int goalMiss = 0; //球队总失球数
};
//排序逻辑函数
bool compare(team &t1, team &t2)
{
if (t1.grade > t2.grade) return true;
else if (t1.grade == t2.grade)
{
if (t1.goalDiff > t2.goalDiff)
return true;
else if (t1.goalDiff == t2.goalDiff)
{
if (t1.goalCount > t2.goalCount)
return true;
else if (t1.goalCount == t2.goalCount)
{
if (t1.name<t2.name)
return true;
else return false;
}
else return false;
}
else return false;
}
else return false;
}
//以小组为单位输入,计算同一小组各支球队的积分,进球数,失球数和净胜球数
void mySort(vector<team> &A)
{
map<string, team> mp;
for (int i = 0; i < 6; i++)
{
char m[12];
cin.getline(m, 12);
string str1, str2, str11, str22;
string str(m);
str1 = str.substr(0, 3);
str2 = str.substr(8, 3);
str11 = str.substr(4, 1);
str22 = str.substr(6, 1);
if (atoi(str11.c_str())>atoi(str22.c_str()))
mp[str1].grade += 3;
else if (atoi(str11.c_str()) < atoi(str22.c_str()))
mp[str2].grade += 3;
else
{
mp[str1].grade += 1;
mp[str2].grade += 1;
}
mp[str1].goalCount += atoi(str11.c_str());
mp[str2].goalCount += atoi(str22.c_str());
mp[str1].goalMiss += atoi(str22.c_str());
mp[str2].goalMiss += atoi(str11.c_str());
mp[str1].name = str1;
mp[str2].name = str2;
}
for (auto it = mp.begin(); it != mp.end();)
{
A.push_back(it->second);
it++;
}
for (int i = 0; i < A.size(); i++)
{
A[i].goalDiff = A[i].goalCount - A[i].goalMiss;
}
sort(A.begin(), A.end(), compare); //排序
cout << endl;
}
int main()
{
vector<vector<team>> t(4);
for (int i = 0; i < 4; i++)
{
mySort(t[i]);
}
for (size_t i = 0; i < t.size(); i++)
{
for (size_t j = 0; j < t[0].size(); j++)
{
cout << t[i][j].name << ' ';
}
cout << endl;
}
system("pause");
cout << endl;
}