2019年网易游戏暑期实习生招聘笔试题(2018年4月27日)第一题解答

本文介绍了一个基于C++实现的足球比赛积分排名系统。该系统能够处理16支分组队伍的比赛结果,并根据胜利、平局和失败的情况计算积分,同时考虑净胜球数和总进球数来决定排名。通过合理的数据结构和排序逻辑,确保了输出结果的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:足球比赛的积分排名,一共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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值