程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu2093 考試排名

hdu2093 考試排名

編輯:C++入門知識

題目:

考試排名
Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
                                                                                     Total Submission(s): 5525    Accepted Submission(s): 1935
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


思路:用結構體 很好解決此問題。
AC代碼:


[cpp] 
#include<iostream> 
#include<cmath> 
#include<stdio.h> 
#include<map> 
#include<string> 
#include<set> 
const int M=6;//開始不知道什麼時候結束輸出,還以為是默認6行呢 
using namespace std; 
struct person 

    char name[10]; 
    int num; //解決的問題數 
    int allt;  //解決問題的總時間 
}; 
int cmp(const void *a,const void *b) 

    struct person *c=(struct person *)a; 
    struct person *d=(struct person *)b; 
    if(c->num!=d->num) //按解決問題數排序 
        return d->num-c->num; 
    else 
    { 
        if(c->allt!=d->allt)  //按總時間數排序 
            return c->allt-d->allt; 
        else 
            return strcmp(c->name,d->name); //按名字的字典序排序 
    } 

int main() 

    int n,i,j,m,x; 
    cin>>n>>m; 
    struct person p[1000]; 
    i=0; 
    while(scanf("%s",p[i].name)!=EOF) 
    { 
        p[i].num=0; 
        p[i].allt=0; 
        for(j=0;j<n;j++) 
        { 
            cin>>x; 
            if(x>0) 
            { 
                p[i].num++; 
                p[i].allt+=x; 
                if(getchar()=='(') 
                { 
                    cin>>x; 
                    p[i].allt+=x*m; 
                    getchar(); 
                } 
            } 
        } 
        i++; 
    } www.2cto.com
    qsort(p,i,sizeof(p[0]),cmp); //排序 
    for(j=0;j<i;j++) 
        printf("%-10s %2d %4d\n",p[j].name,p[j].num,p[j].allt); 
    return 0; 


 


作者:xiongheqiang

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved