HRBUST - 1569 比賽排名

Description

有n個同學參加了一場比賽,每個同學都有一個確定的名字。

並且每個人都一個得分,但可能由於一些犯規導致扣分,所以最終的實際得分爲總得分減去犯規扣分。

如一個人得分爲100,扣分爲10,那麼實際得分爲90。

現在需要你來爲這n個人確定比賽排名。

Input

第一行是一個整數t(t<=20),代表t組測試數據,接下來有t組測試數據。

對於每組測試數據,第一行輸入一個整數n(n<=100)代表有多少個人。

之後輸入n行,每行代表每個人的信息。

每行數據輸入一個學生的名字(不多於10個字符的字符串)以及每個人的得分a(0=<a<=1000)和扣分b(0=<b<=a)。

格式爲a(b),如果b爲0,則直接輸入a無括號。

如得分爲100,扣分爲10。則輸入100(10)。

如果扣分爲0則輸入100無括號。

詳情請看輸入樣例。

Output

對於每組測試數據:

首先將這n個同學按照實際得分從大到小排名。

如果得分相同則按照名字的字典序排從小到大排。

依次輸出每個學生的信息。

每個學生佔一行,輸出名字(10個字符寬,左對齊),實際得分(5個字符寬,右對齊)。

名字和實際得分間有一個空格。

Sample Input

1
4
Smith 100(10)
Bush 100
Bob 100
John 200(20)

Sample Output

John         180
Bob          100
Bush         100
Smith         90
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <iomanip>
#include <algorithm>

using namespace std;

struct node{
    string name;
    int score;
};

void stringToint(string s, int &a, int &b){
    int len = s.length();
    a = b = 0;
    bool flag = false;
    for (int i = 0; i < len; i++){
        if (s[i] == '('){
            flag = true;
            continue;
        } else if (s[i] == ')'){
            break;
        }else 
        if (flag){
            b = b*10 + (s[i] - '0');
        } else {
            a = a*10 + (s[i]-'0');
        }
    }
}

bool cmp(node a, node b){
    if (a.score == b.score)
        return a.name < b.name;
    return a.score > b.score;
}

node info[105];

int main()
{
    int t, n;
    int a, b;
    string s, str;
    
    cin >> t;
    while (t--){
        cin >> n;
        for (int i = 0; i < n; i++){
            cin >> s >> str;
            if (str.find("(", 0) == string::npos){
                a = 0;
                for (int j = 0; j < str.length(); j++){
                    a = a*10 + (str[j]-'0');
                }
                b = 0;
            } else {
                stringToint(str, a, b);
            }
            info[i].name = s;
            info[i].score = a - b;
        }
        sort(info, info+n, cmp);
        for (int i = 0; i < n; i++){
            cout << setiosflags(ios::left) << setw(10) << info[i].name << " ";
            cout << setiosflags(ios::right);
            cout << setw(5) << info[i].score << endl;
            cout << resetiosflags(ios::right);
        }
    }
    
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章