【HDU - 2093】 考试排名(排序+格式输出)
生活随笔
收集整理的這篇文章主要介紹了
【HDU - 2093】 考试排名(排序+格式输出)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題干:
C++編程考試使用的實時提交系統(tǒng),具有即時獲得成績排名的特點。它的功能是怎么實現(xiàn)的呢??我們做好了題目的解答,提交之后,要么“AC”,要么錯誤,不管怎樣錯法,總是給你記上一筆,表明你曾經(jīng)有過一次錯誤提交,因而當你一旦提交該題“AC”后,就要與你算一算帳了,總共該題錯誤提交了幾回。雖然你在題數(shù)上,大步地躍上了一個臺階,但是在耗時上要攤上你共花去的時間。特別是,曾經(jīng)有過的錯誤提交,每次都要攤上一定的單位時間分。這樣一來,你在做出的題數(shù)上,可能領(lǐng)先別人很多,但是,在做出同樣題數(shù)的人群中,你可能會在耗時上處于排名的劣勢。?
例如:某次考試一共8題(A,B,C,D,E,F,G,H),每個人做的題都在對應(yīng)的題號下有個數(shù)量標記,負數(shù)表示該學生在該題上有過的錯誤提交次數(shù),但到現(xiàn)在還沒有AC,正數(shù)表示AC所耗的時間,如果正數(shù)a跟上一對括號,里面有個整數(shù)b,那就表示該學生提交該題AC了,耗去了時間a,同時,曾經(jīng)錯誤提交了b次,因此對于下述輸入數(shù)據(jù):?
?
若每次錯誤提交的罰分為20分,則其排名從高到低應(yīng)該是這樣的:?
Josephus 5 376?
John 4 284?
Alice 4 352?
Smith 3 167?
Bob 2 325?
Bush 0 0?
Input輸入數(shù)據(jù)的第一行是考試題數(shù)n(1≤n≤12)以及單位罰分數(shù)m(10≤m≤20),每行數(shù)據(jù)描述一個學生的用戶名(不多于10個字符的字串)以及對所有n道題的答題現(xiàn)狀,其描述采用問題描述中的數(shù)量標記的格式,見上面的表格,提交次數(shù)總是小于100,AC所耗時間總是小于1000。?
Output將這些學生的考試現(xiàn)狀,輸出一個實時排名。實時排名顯然先按AC題數(shù)的多少排,多的在前,再按時間分的多少排,少的在前,如果湊巧前兩者都相等,則按名字的字典序排,小的在前。每個學生占一行,輸出名字(10個字符寬),做出的題數(shù)(2個字符寬,右對齊)和時間分(4個字符寬,右對齊)。名字、題數(shù)和時間分相互之間有一個空格。?
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 0Sample Output Josephus 5 376 John 4 284 Alice 4 352 Smith 3 167 Bob 2 325 Bush 0 0
題目分析:
????題目不難但是小細節(jié)很多。。。還有一點就是 光wa不ac的情況竟然不算罰時。。。。
ac代碼:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> const int MAX = 10000 + 5; using namespace std;struct Node {char name[15];int sumtime;int ac;} node[MAX];bool cmp(Node a, Node b) {if(a.ac!=b.ac) return a.ac>b.ac;if(a.sumtime!=b.sumtime) return a.sumtime<b.sumtime;return !strcmp(a.name,b.name);} int main() {int n,penalty,num=0;char tmps[15];int tmp;int len;scanf("%d %d",&n, &penalty);while(~scanf("%s",node[num].name) ) {node[num].ac=node[num].sumtime=0;for(int i = 0; i<n; i++) {tmp=0;//待定 scanf("%s",tmps); len=strlen(tmps);printf("ttttttttttttmps=%s************%d\n",tmps,len) ;if(tmps[0]=='0') {printf("tmps[0]=='0'跳過 \n");continue;}if(tmps[0]=='-') {printf("負號 \n"); // tmp=0; // for(int j = 1;j<len; j++) tmp=tmp*10+tmps[j]-'0'; // node[num].sumtime+=tmp*penalty; // printf("tmp=%d sumtime=%d\n",tmp,node[num].sumtime);continue;}node[num].ac++;if(strstr(tmps,"(")==NULL ) {printf("沒有括號 \n");tmp=0;for(int j = 0; j<len; j++) {tmp=tmp*10+tmps[j]-'0';}node[num].sumtime+=tmp;printf("tmp=%d sumtime=%d\n",tmp,node[num].sumtime);continue;}//剩下的情況就只有包含'('的了printf("有括號 \n");int pos=strstr(tmps,"(")-tmps;tmp=0;for(int j = 0; j<pos; j++) {tmp=tmp*10+tmps[j]-'0';} node[num].sumtime+=tmp; printf("tmp=%d sumtime=%d\n",tmp,node[num].sumtime);tmp=0;int ppos=strstr(tmps, ")" ) -tmps;for(int j = pos+1; j<ppos; j++) {tmp=tmp*10+tmps[j]-'0';}node[num].sumtime+=tmp*penalty; printf("tmp=%d sumtime=%d\n",tmp,node[num].sumtime);}num++;}sort(node,node+num,cmp);for(int i=0; i<num; i++) {printf("%-10s%3d%5d\n",node[i].name,node[i].ac,node[i].sumtime);}return 0 ; } /*8 20 a -1 -16 8 0 0 120 39 0 b 116 -2 11 0 0 82 55(1) 0 c 72(3) 126 10 -3 0 47 21(2) -2 d 0 -1 -8 50(235) 0 0 0 0 e -2 67(2) 13 -1 0 133 79(1) -1 f 0 0 57(5) 0 0 168 -7 0*/ /* c 5 376 b 4 284 e 4 352 a 3 167 f 2 325 d 1 4750 */總結(jié):
????注意一下別忘初始化變量,會表示按照格式輸出。左對齊右對齊
總結(jié)
以上是生活随笔為你收集整理的【HDU - 2093】 考试排名(排序+格式输出)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lxdboxcp.exe是什么进程 有什
- 下一篇: 动手学PaddlePaddle(5):迁