天天看點

2093 考試排名

Problem Description

C++程式設計考試使用的實時送出系統,具有即時獲得成績排名的特點。它的功能是怎麼實作的呢?

我們做好了題目的解答,送出之後,要麼“AC”,要麼錯誤,不管怎樣錯法,總是給你記上一筆,表明你曾經有過一次錯誤送出,因而當你一旦送出該題“AC”後,就要與你算一算帳了,總共該題錯誤送出了幾回。雖然你在題數上,大步地躍上了一個台階,但是在耗時上要攤上你共花去的時間。特别是,曾經有過的錯誤送出,每次都要攤上一定的機關時間分。這樣一來,你在做出的題數上,可能領先别人很多,但是,在做出同樣題數的人群中,你可能會在耗時上處于排名的劣勢。

例如:某次考試一共8題(A,B,C,D,E,F,G,H),**每個人做的題都在對應的題号下有個數量标記,負數表示該學生在該題上有過的錯誤送出次數,但到現在還沒有AC,正數表示AC所耗的時間,如果正數a跟上一對括号,裡面有個整數b,那就表示該學生送出該題AC了,耗去了時間a,同時,曾經錯誤送出了b次,**是以對于下述輸入資料:

2093 考試排名

若每次錯誤送出的罰分為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

#include<iomanip>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct acm    //定義結構體
{
    char name[100];
    int ac;
    int sj;
}ss[10000];
bool cmp(acm a,acm b)  //排序函數
{
    if(a.ac==b.ac)
    {
        return a.sj<b.sj;  //成績為時間,越小越大
    }
    else
    {
        return a.ac>b.ac;  //ac數,大則大。
    }
}
int main()
{
    int z=0;
    int n,m;
    cin>>n>>m;    //輸入考試題數n,機關罰分數m。
        while(cin>>ss[z].name)  //沒有規定人數,直接用while循環
        {
            for(int a=0;a<n;a++)
            {
                char ch;  //定義一個字元,在下面用于接收“)”
                int k,l;
                cin>>k;  //接收成績
                if(k<=0)
                {
                    continue;  //如果輸入的成績小于0則跳出目前循環,進行下一次循環。
                }
                ss[z].ac++; //沒有跳出循環的話,程式從上而下,執行這條語句,ac數+1
                ss[z].sj+=k;//目前人的總成績
                if(getchar()=='(')//如果有字元“(”,接收且判斷。Getchar()用于隻接收一個字元。
                {
                    cin>>l;   //接收罰題次數
                    cin>>ch;  //接收字元“)”
                    ss[z].sj+=l*m; //總成績加上罰時
                }
            }
            z++;  //次數+1,此用于判斷總統計人數。不然沒有辦法輸出。
        }
    sort(ss,ss+n,cmp); //結構體排序
    for(int i=0;i<z;i++)
    {
        cout<<left<<setw(10)<<ss[i].name<<" "<<right<<setw(2)<<ss[i].ac<<right<<" "<<setw(4)<<ss[i].sj<<endl;  //setw前帶left,或者right表示資料左對齊還是有對齊,setw(n)表示n個長度。
    }
    return 0;

           

繼續閱讀