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、付费专栏及课程。

余额充值