1. 程式人生 > >B - 考試排名

B - 考試排名

bit += 現在 都在 臺階 空格 cin sco 實時

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

就是排序,只要用上sort加cmp就方便多了

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<cmath>
#include<string.h>
#include<algorithm>
#define sf scanf
#define pf printf
#define pb push_back
#define mm(x,b) memset((x),(b),sizeof(x))
#include<vector>
typedef long long ll;
typedef double db;
const ll mod=1e9+7;
using namespace std;
const double pi=acos(-1.0);
struct q
{
    char name[20];
    int num;
    int score;
}x[10005];
int cmp(q x,q y)
{
    if(x.num!=y.num)
        return x.num>y.num;
    return x.score<y.score;
}
int bits=0;
int main()
{
    int n,m;
    cin>>n>>m;
    while(sf("%s",&x[bits].name )!=EOF)
    {
    //  sf("%s",&x[bits].nxme );
        x[bits].num =0;
        x[bits].score =0;
        char c[15];
        for(int i=0;i<n;i++)
        {
            mm(c,0);
            sf("%s",&c);
            int len=strlen(c);
            if(c[0]==‘0‘||c[0]==‘-‘)
            continue;
            else
            {
                int sum=0,j;
                for( j=0;j<len;j++)
                {
                    if(c[j]==‘(‘)
                    break;
                    sum=sum*10+c[j]-48;
                }
                int xns=0;
                if(c[j]==‘(‘)
                {
                    xns=c[j+1]-48;
                    if(c[j+2]!=‘)‘)//就tm是這一點,狗,卡了我一萬年,嗚嗚嗚手殘打錯
                    xns=xns*10+c[j+2]-48;
                }
                x[bits].num ++;
                x[bits].score +=sum+xns*m;
            }
        }
        bits++;
    }
    sort(x,x+bits,cmp);
    for(int i=0;i<bits;i++)
    pf("%-10s %2d %4d\n",x[i].name ,x[i].num ,x[i].score );
    return 0;
}

B - 考試排名