UVaOJ 10194 - Football(aka Soccer)

本文介绍了一个模拟足球小组赛的算法题目解决方案,通过比赛记录计算各队得分、排名等详细数据,并使用自定义排序规则对球队进行排序。

AOAPC I: Beginning Algorithm Contests (Rujia Liu) :: Volume 1. Elementary Problem Solving ::Sorting/Searching


Description

模拟足球小组赛的规则, 通过比赛记录, 计算出最后的 rank 及队伍的各项数据。

rank 规则(优先级从高到低):

  1. 分数最多者。
  2. 胜场最多者。
  3. 进丢球差最大者。
  4. 进球数最多者。
  5. 比赛场次少者。
  6. 队名字典序小者。
而一场比赛, 胜者得 3 分, 输者得 2 分。

Type

Sorting/Searching


Analysis

入门级的恶心模拟题。

注意队名是含有大小写字母的, 而字典序中大小写没有区别。

这就造成了字典序, 和 STL string 默认的小于号, 有细微的差别。

这细微的差别可能就是你无限 WA 的根源。


Solution

// UVaOJ 10194
// Football(aka Soccer)
// by A Code Rabbit

#include <algorithm>
#include <cctype>
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;

string ToLower(string);

struct Team {
    string name;
    int point;
    int game;
    int win, tie, loss;
    int scored, against, difference;
    void Init() {
        point = game = win = tie = loss = scored = against = difference = 0;
    }
    bool operator<(Team another) const {
        if (this->point != another.point)
            return this->point > another.point;
        else if (this->win != another.win)
            return this->win > another.win;
        else if (this->difference != another.difference)
            return this->difference > another.difference;
        else if (this->scored != another.scored)
            return this->scored > another.scored;
        else if (this->game != another.game)
            return this->game < another.game;
        else
            return ToLower(this->name) < ToLower(another.name);
    }
};

string tournament;
int t;
Team team[32];
int g;
string team_name_1, team_name_2;
int goals1, goals2;

void Analyze(string team1, string team2, int goal1, int goal2);

int main() {
    int tot_case;
    cin >> tot_case;
    cin.get();
    while (tot_case--) {
        // Input.
        getline(cin, tournament);
        cin >> t;
        cin.get();
        for (int i = 0; i < t; i++) {
            team[i].Init();
            getline(cin, team[i].name);
        }
        cin >> g;
        cin.get();
        // Input data and analyze data.
        for (int i = 0; i < g; i++) {
            getline(cin, team_name_1, '#');
            cin >> goals1;
            cin.get();
            cin >> goals2;
            cin.get();
            getline(cin, team_name_2);
            team_name_1 = str1;
            team_name_2 = str2;
            Analyze(team_name_1, team_name_2, goals1, goals2);
        }
        // Rank.
        sort(team, team + t);
        // Output.
        printf("%s\n", tournament.c_str());
        for (int i = 0; i < t; i++) {
            printf("%d) %s %dp, %dg (%d-%d-%d), %dgd (%d-%d)\n",
                i + 1, team[i].name.c_str(), team[i].point, team[i].game,
                team[i].win, team[i].tie, team[i].loss, team[i].difference,
                team[i].scored, team[i].against);
        }
        printf("%s", tot_case ? "\n" : "");
    }

    return 0;
}

string ToLower(string str) {
    for (int i = 0; i < str.length(); i++)
        str[i] = tolower(str[i]);
    return str;
}

void Analyze(string team_name_1, string team_name_2, int goal1, int goal2) {
    Team* team1;
    Team* team2;
    for (int i = 0; i < t; i++) {
        if (team[i].name == team_name_1)
            team1 = &team[i];
        if (team[i].name == team_name_2)
            team2 = &team[i];
    }
    
    if (goal1 > goal2) {
        team1->point += 3; 
        team1->win++;
        team2->loss++;
    } else
    if (goal1 < goal2) {
        team1->loss++;
        team2->win++;
        team2->point += 3;
    } else
    if (goal1 == goal2) {
        team1->point++;
        team1->tie++;
        team2->point++;
        team2->tie++;
    }
    /* team1 */
    team1->game++;
    team1->scored += goal1;
    team1->against += goal2;
    team1->difference = team1->scored - team1->against;
    /* team2 */
    team2->game++;
    team2->scored += goal2;
    team2->against += goal1;
    team2->difference = team2->scored - team2->against;
}

本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化与数据处理的自动化,以提升日常教学管理工作的效率与准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程与成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批与教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划与资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课与成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值