2011-08-22 17:39:04Morris

b207. F. 世界盃

b207. F. 世界盃

內容 :

2010 年南非世界盃即將到來,現在各區預賽都打得難分難解,身為亞洲足球總會主席的你,必須負責主辦亞洲區的預賽,按照慣例亞洲區將有4.5 個國家可以晉級會內賽,為什麼會有小數點呢?因為除了直接晉級的四支隊伍以外,排名第五的隊伍必須跟大洋洲的冠軍隊進行附加賽,贏的國家才能晉級。
亞洲區預賽已經進行到最後八強,八支球隊分成兩個小組激戰,所有的賽事都已經比完,到了選出晉級球隊的時候,妳的祕書今天早上已經將各隊對戰的成績交給你,你必須依照以下的規則列出五支球隊:
1. 先列出 A 組的前兩名
2. 再列出 B 組的前兩名
3. 接著列出戰績最佳的第三名
比較球隊勝負的方式是看積分,贏一場得三分,平手兩隊各得一分,如果積分相同的話,比誰的進球數多,還是相同就比誰的失球少,再相同的話比國家名稱的字典順序看誰比較前面。

輸入說明 :

輸入檔中會有多筆資料,第一行是一個整數 N(1<N<=50),用來表示有幾筆測試資料。每筆測試資料的前八行是國家名稱(國家名稱不會有空白字元,且長度不會超過100 個字元),前四隊為A 組,後四隊為B 組,接下來12 行為對戰成績,對戰成績表示方法如下:
<國家A> <A 得分> <B 得分> <國家B>

輸出說明 :

對每組測試資料,請參考範例輸出,用相同的格式輸出五個國家名稱。

範例輸入 :help

1
Japan
South_Korea
China
Iraq
Iran
Chinese_Taipei
Hong_Kong
Macow
Japan 0 0 South_Korea
Japan 3 0 China
Japan 2 0 Iraq
South_Korea 2 0 China
South_Korea 1 1 Iraq
China 0 2 Iraq
Iran 8 0 Chinese_Taipei
Iran 5 0 Hong_Kong
Iran 10 0 Macow
Chinese_Taipei 0 5 Hong_Kong
Chinese_Taipei 3 0 Macow
Hong_Kong 2 0 Macow

範例輸出 :

A1 Japan
A2 South_Korea
B1 Iran
B2 Hong_Kong
BEST3 Iraq

提示 :

出處 :

2008 NPSC 國中組初賽


作法 : 模擬
套用一下眾多的內建, 我有點懶了

/**********************************************************************************/
/*  Problem: b207 "F. 世界盃" from 2008 NPSC 國中組初賽                   */
/*  Language: C                                                                   */
/*  Result: AC (2ms, 232KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-08-22 17:32:58                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Data {
    char name[101];
    int inball, outball, score;
}Data;
Data team[8];
int cmp(const void *a, const void *b) {
    Data *aa, *bb;
    aa = (Data *)a, bb = (Data *)b;
    if(aa->score > bb->score)    return 0;
    else if(aa -> score < bb->score)    return 1;
    else {
        if(aa->inball > bb->inball)    return 0;
        else if(aa->inball < bb->inball) return 1;
        else {
            if(aa->outball < bb->outball)    return 0;
            else if(aa->outball > bb->outball) return 1;
            else {
                int i;
                for(i = 0; ; i++)
                    if(aa->name[i] < bb->name[i])
                        return 0;
                    else if(aa->name[i] > bb->name[i])
                        return 1;
                return 0;
            }
        }
    }
}
main() {
    int n, a, b, As, Bs;
    scanf("%d", &n);
    while(n--) {
        for(a = 0; a < 8; a++) {
            scanf("%s", team[a].name);
            team[a].inball = 0, team[a].outball = 0;
            team[a].score = 0;
        }
        char A[101], B[101], Aidx, Bidx;
        for(a = 0; a < 12; a++) {
            scanf("%s %d %d %s", A, &As, &Bs, B);
            for(b = 0; b < 8; b++)
                if(!strcmp(team[b].name, A))
                    {Aidx = b;break;}
            for(b = 0; b < 8; b++)
                if(!strcmp(team[b].name, B))
                    {Bidx = b;break;}
            team[Aidx].inball += As, team[Aidx].outball += Bs;
            team[Bidx].inball += Bs, team[Bidx].outball += As;
            if(As > Bs)    team[Aidx].score += 3;
            else if(As < Bs) team[Bidx].score += 3;
            else    team[Aidx].score++, team[Bidx].score++;
        }
        qsort(team, 4, sizeof(Data), cmp);
        qsort(team+4, 4, sizeof(Data), cmp);
        for(a = 0; a < 2; a++)
            printf("A%d %s\n", a+1, team[a].name);
        for(a = 4; a < 6; a++)
            printf("B%d %s\n", a-3, team[a].name);
        if(!cmp(&team[2], &team[6]))
            printf("BEST3 %s\n", team[2].name);
        else    printf("BEST3 %s\n", team[6].name);
    }
    return 0;
}