TIOJ-1039

B.魔術數字

https://tioj.ck.tp.edu.tw/problems/1039

Description

超級長orz
總之名次的比較是看勝率,勝率的定義是「勝場數/(勝場數+敗場數)」
而兩隊魔術數字$M$的定義如下:
假設A隊的勝率領先B隊,只要A隊再贏除了B隊以外的隊伍$M$場,就算$B$隊剩下的所有場次都贏也不能得到和A相等的勝率
假設$M$大於A隊對上除了B隊以外的隊伍剩下的場次,那我們說A隊對B隊的魔術數字尚未點亮
否則我們說A隊對B隊的魔術數字是$M$
如果$M$歸零的話,表示A隊不管怎麼樣名次都會超過B隊

對於每一筆測試資料,請輸出一排版過的戰績表。依n支球隊的戰績排名順序輸出n行。除了第1名球隊以外,若發生勝率相同的情形,請依球隊在原資料的出現順序為輸出順序,但其排名則應並列。格式請參考範例輸出。隊名,勝率,魔術數字分別以一個空格來間隔,而隊名部分不足9個字元的部分則需填入空格。勝率固定輸出到小數點後三位(四捨五入)。第一名球隊不需要輸出魔術數字,請你分別計算出第一名球隊對其他球隊的魔術數字。若對其他球隊的魔術數字尚未點亮,請輸出--。若魔術數字已點亮,則輸出M以及該數字。測試資料之間請留一個空行。

Solution

呃…就是一大堆噁心輸出
注意勝率的定義不包括和局QQ
計算魔術數字的方法就是用while迴圈一直加,跑到在題敘指定的情況下A隊的勝率會大於B隊的勝率
噢名次的地方也是要注意QQ很容易沒注意就寫錯
還有他的空行是在測試資料之間(?)雖然我不知道有沒有差啦

AC code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <cstdio>
#include <cmath>
#include <algorithm>
struct Team {
    char name[10];
    int W, T, L, id;
    double rate;
    friend bool operator<(const Team &a, const Team &b) {
        return a.rate != b.rate ? a.rate > b.rate : a.id < b.id;
    }
} t[100];
int rest[100][100];
signed main() {
    int n, g;
    bool first = true;
    while(scanf("%d%d", &n, &g), n || g) {
        if(!first) puts("");
        first = false;
        for(int i = 0; i < n; i++) {
            scanf("%s%d%d%d", t[i].name, &t[i].W, &t[i].T, &t[i].L);
            t[i].id = i;
            t[i].rate = t[i].W / double(t[i].W+t[i].L);
        }
        for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) scanf("%d", &rest[i][j]);
        std::sort(t, t+n);
        int rk = 0;
        double last = 7122;
        for(int i = 0; i < n; i++) {
            if(t[i].rate != last) rk = i+1;
            last = t[i].rate;
            printf("%d:%-9s %.3f", rk, t[i].name, round(t[i].rate * 1000) / 1000);
            if(i) {
                int magic = 0;
                while((t[0].W + magic) / double(g - t[0].T) <= (g - t[i].T - t[i].L) / double(g - t[i].T)) ++magic;
                if(magic <= g - (t[0].W+t[0].T+t[0].L) - rest[t[0].id][t[i].id])
                    printf(" M%d", magic);
                else
                    printf(" --");
            }
            puts("");
        }
    }
}
comments powered by Disqus