HDU2093 考試排名【排序】

考試排名

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 29108 Accepted Submission(s): 9531

Problem Description
C++編程考試使用的實時提交系統,具有即時獲得成績排名的特點。它的功能是怎麼實現的呢?
我們做好了題目的解答,提交之後,要麼“AC”,要麼錯誤,不管怎樣錯法,總是給你記上一筆,表明你曾經有過一次錯誤提交,因而當你一旦提交該題“AC”後,就要與你算一算帳了,總共該題錯誤提交了幾回。雖然你在題數上,大步地躍上了一個臺階,但是在耗時上要攤上你共花去的時間。特別是,曾經有過的錯誤提交,每次都要攤上一定的單位時間分。這樣一來,你在做出的題數上,可能領先別人很多,但是,在做出同樣題數的人羣中,你可能會在耗時上處於排名的劣勢。
例如:某次考試一共8題(A,B,C,D,E,F,G,H),每個人做的題都在對應的題號下有個數量標記,負數表示該學生在該題上有過的錯誤提交次數,但到現在還沒有AC,正數表示AC所耗的時間,如果正數a跟上一對括號,裏面有個整數b,那就表示該學生提交該題AC了,耗去了時間a,同時,曾經錯誤提交了b次,因此對於下述輸入數據:

在這裏插入圖片描述

若每次錯誤提交的罰分爲20分,則其排名從高到低應該是這樣的:
Josephus 5 376
John 4 284
Alice 4 352
Smith 3 167
Bob 2 325
Bush 0 0

Input
輸入數據的第一行是考試題數n(1≤n≤12)以及單位罰分數m(10≤m≤20),每行數據描述一個學生的用戶名(不多於10個字符的字串)以及對所有n道題的答題現狀,其描述採用問題描述中的數量標記的格式,見上面的表格,提交次數總是小於100,AC所耗時間總是小於1000。

Output
將這些學生的考試現狀,輸出一個實時排名。實時排名顯然先按AC題數的多少排,多的在前,再按時間分的多少排,少的在前,如果湊巧前兩者都相等,則按名字的字典序排,小的在前。每個學生佔一行,輸出名字(10個字符寬),做出的題數(2個字符寬,右對齊)和時間分(4個字符寬,右對齊)。名字、題數和時間分相互之間有一個空格。

Sample Input
8 20
Smith -1 -16 8 0 0 120 39 0
John 116 -2 11 0 0 82 55(1) 0
Josephus 72(3) 126 10 -3 0 47 21(2) -2
Bush 0 -1 -8 0 0 0 0 0
Alice -2 67(2) 13 -1 0 133 79(1) -1
Bob 0 0 57(5) 0 0 168 -7 0

Sample Output
Josephus 5 376
John 4 284
Alice 4 352
Smith 3 167
Bob 2 325
Bush 0 0

Author
qianneng

Source
迎接新學期——超級Easy版熱身賽

問題鏈接HDU2093 考試排名
問題簡述:(略)
問題分析:結構排序問題,不解釋。
程序說明:(略)
參考鏈接:(略)
題記:(略)

AC的C++語言程序如下:

/* HDU2093 考試排名 */

#include <bits/stdc++.h>

using namespace std;

const int N = 1000;
struct Node {
    string name;
    int num;
    int time;
} a[N];

int cmp(Node& a, Node& b)
{
    return a.num != b.num ? a.num > b.num : (a.time != b.time ? a.time < b.time : a.name < b.name);
}

int main()
{
    int n, m, cnt = 0;
    string name, buf;
    cin >> n >> m;
    while(cin >> name) {
        a[cnt].name = name;
        a[cnt].num = 0;
        a[cnt].time = 0;
        for(int i = 0; i < n; i++) {
            cin >> buf;
            if(buf[0] == '-' || buf[0] == '0')
                continue;
            int d;
            sscanf(buf.c_str(), "%d", &d);
            a[cnt].num++;
            a[cnt].time += d;
            int pos = buf.find('(');
            if(pos != string::npos) {
                sscanf(buf.c_str() + pos + 1, "%d", &d);
                a[cnt].time += d * m;
            }
        }
        cnt++;
    }

    sort(a, a + cnt, cmp);

    for(int i = 0; i < cnt; i++)
        printf("%-10s %2d %4d\n", a[i].name.c_str(), a[i].num, a[i].time);

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