對於在中國大學MOOC(http://www.icourse163.org/ )學習「數據結構」課程的學生,想要得到一張合格證書,必須首先得到很多於200分的在線編程做業分,而後總評得到很多於60分(滿分100)。總評成績的計算公式爲 G=(Gmid−term×40%+Gfinal×60%),若是 Gmid−term>Gfinal;不然總評 G 就是 Gfinal。這裏 Gmid−term 和 Gfinal 分別爲學生的期中和期末成績。ios
如今的問題是,每次考試都產生一張獨立的成績單。本題就請你編寫程序,把不一樣的成績單合爲一張。編程
輸入在第一行給出3個整數,分別是 P(作了在線編程做業的學生數)、M(參加了期中考試的學生數)、N(參加了期末考試的學生數)。每一個數都不超過10000。數組
接下來有三塊輸入。第一塊包含 P 個在線編程成績 Gp;第二塊包含 M 個期中考試成績 Gmid−term;第三塊包含 N 個期末考試成績 Gfinal。每一個成績佔一行,格式爲:學生學號 分數
。其中學生學號
爲不超過20個字符的英文字母和數字;分數
是非負整數(編程總分最高爲900分,期中和期末的最高分爲100分)。數據結構
打印出得到合格證書的學生名單。每一個學生佔一行,格式爲:學習
學生學號
Gp Gmid−term Gfinal G測試
若是有的成績不存在(例如某人沒參加期中考試),則在相應的位置輸出「−1」。輸出順序爲按照總評分數(四捨五入精確到整數)遞減。如有並列,則按學號遞增。題目保證學號沒有重複,且至少存在1個合格的學生。spa
6 6 7 01234 880 a1903 199 ydjh2 200 wehu8 300 dx86w 220 missing 400 ydhfu77 99 wehu8 55 ydjh2 98 dx86w 88 a1903 86 01234 39 ydhfu77 88 a1903 66 01234 58 wehu8 84 ydjh2 82 missing 99 dx86w 81
missing 400 -1 99 99 ydjh2 200 98 82 88 dx86w 220 88 81 84 wehu8 300 55 84 84
題解:這道題目作起來仍是有點麻煩的,若是不用map的話通常就會超時,最後一個測試點竟然是有人期中考試考0分,多虧一位大哥指點,要否則怕是想破腦殼也想不出來。
剛開始對於上機成績不足200的直接跳過,由於若是成績合格的話必須參加期末考試,因此當輸入期末考試成績時,對於合格的成績,存進一個數組內(或者vecetor),寫一個結構體排序,而後依次輸出便可。
代碼以下:
1 #include<iostream> 2 #include<map> 3 #include<string> 4 #include<algorithm> 5 using namespace std; 6 7 struct stu{ 8 string name; 9 double gp = -1, gm = -1, gf = -1; 10 int g = 0; 11 }; 12 13 bool cmp( const stu &a, const stu & b){ 14 if( a.g != b.g) 15 return a.g > b.g; 16 else 17 return a.name < b.name; 18 } 19 20 int main() 21 { 22 int P, M, N, temp = 0, grade; 23 stu a[10000]; 24 double sco; 25 map<string, double> b; 26 map<string, double> c; 27 string nam; 28 scanf("%d %d %d", &P, &M, &N); 29 for( int i = 0; i < P; i++){ 30 cin>>nam>>sco; 31 if(sco >= 200){ 32 b[nam] = sco; 33 } 34 } 35 for( int i = 0; i < M; i++){ 36 cin>>nam>>sco; 37 if(b[nam] >= 200){ 38 c[nam] = sco; 39 } 40 } 41 for( int i = 0; i < N; i++){ 42 cin>>nam>>sco; 43 if( b[nam] < 200) 44 continue; 45 if( c.count(nam) > 0 && c[nam] > sco) 46 grade = (int)((c[nam]*0.4 + sco*0.6) + 0.5); 47 else 48 grade = (int)sco; 49 if( grade >= 60){ 50 a[temp].name = nam; 51 a[temp].gp = b[nam]; 52 if(c.count(nam) == 0) 53 a[temp].gm = -1; 54 else 55 a[temp].gm = c[nam]; 56 a[temp].gf = sco; 57 a[temp].g = grade; 58 temp++; 59 } 60 } 61 sort(a,a+temp,cmp); 62 for( int i = 0; i < temp; i++){ 63 cout<<a[i].name; 64 printf(" %.0lf %.0lf %.0lf %d\n",a[i].gp,a[i].gm,a[i].gf,a[i].g); 65 } 66 return 0; 67 }