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;
}