hdu 2093 考試排名 (模擬)

考試排名php

 

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

 

思路:字符串模擬加排序,基礎題,一遍太低調低調......
 
 
 
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<map>
 7 #include<set>
 8 #include<vector>
 9 #include<queue>
10 using namespace std; 11 #define ll long long 
12 const int mod=1e9+7; 13 const int inf=1e9+7; 14 
15 typedef struct
16 { 17     string name;//名字 
18     int AC;//AC題數 
19     int penalty;//罰時 
20 } St; 21 
22 vector<St>v;//考慮到人數不肯定,用不定長結構體數組(STl真香) 
23 
24 bool cmp(const St &a,const St &b)//按題意寫cmp函數 
25 { 26     if(a.AC!=b.AC)//AC題數不一樣 
27         return a.AC > b.AC;//題數多排名前 
28     else//AC題數相同 
29  { 30         if(a.penalty!=b.penalty)//罰時不一樣 
31             return a.penalty < b.penalty;//罰時少排名前 
32         else//罰時相同 
33             return a.name < b.name;//名字字典序小排名前(講道理應該並列吧orzorz) 
34  } 35 } 36 
37 int main() 38 { 39     //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
40     
41     int n,time;//n個題,罰時 
42     
43     cin>>n>>time; 44     
45     string id;//名字 
46     
47     St now;//定義一個結構體記錄每次輸入一我的名數據 
48     string str;//對n個題的狀況處理 
49     
50     while(cin>>id)//這樣寫讀到文件尾EOF會退出循環,本身debug能夠摁ctrl+z手動退出 
51  { 52         now.name=id;//存名字 
53         int ans=0;//計算罰時 
54         int ac=0;//計算AC數 
55         for(int i=0;i<n;i++) 56  { 57             cin>>str;//讀入每一個題狀況 
58             if(str[0]=='-'||str=="0")//沒作出||沒作,直接跳過 
59                 continue; 60             ac++;//不然確定AC了 
61             if(str.find("(")!=-1)//找到括號 
62  { 63                 int place1=str.find("("); 64                 int place2=str.find(")"); 65                 ans+=stoi(str.substr(0,place1));//計算兩個罰時 
66                 ans+=stoi(str.substr(place1+1,place2-place1-1))*time; 67  } 68             else
69  { 70                 ans+=stoi(str);//無括號一個罰時 
71  } 72  } 73         now.AC=ac;//存AC數 
74         now.penalty=ans;//存罰時 
75         v.push_back(now);//導入結構體數組 
76  } 77     
78     sort(v.begin(),v.end(),cmp);//按題意排序 
79     
80     for(int i=0;i<v.size();i++) 81     {    //格式輸出
82         printf("%-10s %2d %4d\n",v[i].name.c_str(),v[i].AC,v[i].penalty); 83  } 84     
85     return 0; 86 }
相關文章
相關標籤/搜索