?
?
To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C - C Programming Language, M - Mathematics (Calculus or Linear Algebra), and E - English. At the mean time, we encourage students by emphasizing on their best ranks -- that is, among the four ranks with respect to the three courses and the average grade, we print the best rank for each student.
?
For example, The grades of C, M, E and A - Average of 4 students are given as the following:
?StudentID??C??M??E??A
310101?????98 85 88 90
310102?????70 95 88 84
310103?????82 87 94 88
310104?????91 91 91 91
?
?Then the best ranks for all the students are No.1 since the 1st one has done the best in C Programming Language, while the 2nd one in Mathematics, the 3rd one in English, and the last one in average.
?
Input
?
Each input file contains one test case. Each case starts with a line containing 2 numbers N and M (<=2000), which are the total number of students, and the number of students who would check their ranks, respectively. Then N lines follow, each contains a student ID which is a string of 6 digits, followed by the three integer grades (in the range of [0, 100]) of that student in the order of C, M and E. Then there are M lines, each containing a student ID.
?
Output
?
For each of the M students, print in one line the best rank for him/her, and the symbol of the corresponding rank, separated by a space.
?
The priorities of the ranking methods are ordered as A > C > M > E. Hence if there are two or more ways for a student to obtain the same best rank, output the one with the highest priority.
?
If a student is not on the grading list, simply output "N/A".
Sample Input
5 6
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 91 91 91
310105 85 90 90
310101
310102
310103
310104
310105
999999
?Sample Output
1 C
1 M
1 E
1 A
3 A
N/A
?
排名不應該只是簡單的排序算法:
比如說??100,100,99,……???得99分是人是 第二名,而不是第三名。
所以,應該先對分數進行排序,然后在更新名次,算法如下:
????????
? ??
1 SS[ 0 ].ra= 1 ; // 第一個肯定是第一名 2 3 int count= 1 ; 4 5 for (i= 1 ;i<n;i++ ) 6 7 { 8 9 if (SS[i].A==SS[i- 1 ].A) // A為平均分 10 11 { 12 13 SS[i].ra=SS[i- 1 ].ra; // ra 平均分排名 14 15 count++; // 如果分數相同,那么名次和前一個相同,計數器++ 16 17 } 18 19 else 20 21 { 22 23 SS[i].ra=SS[i- 1 ].ra+ count; 24 25 count= 1 ; // 計算器記得還原 26 27 } 28 29 }
?
?
?
AC代碼:
?

1 #include <iostream> 2 3 #include <algorithm> 4 5 #include < string > 6 7 using namespace std; 8 9 10 11 struct stu 12 13 { 14 15 string ID; 16 17 int A,C,M,E; 18 19 int ra,rc,rm,re; 20 21 }; 22 23 24 25 stu SS[ 10001 ]; 26 27 28 29 30 31 32 33 bool cmp1(stu a,stu b) 34 35 { 36 37 return a.A> b.A; 38 39 } 40 41 42 43 44 45 bool cmp2(stu a,stu b) 46 47 { 48 49 return a.C> b.C; 50 51 } 52 53 54 55 bool cmp3(stu a,stu b) 56 57 { 58 59 return a.M> b.M; 60 61 } 62 63 64 65 66 67 bool cmp4(stu a,stu b) 68 69 { 70 71 return a.E> b.E; 72 73 } 74 75 76 77 int main() 78 79 { 80 81 82 83 int n; 84 85 while (cin>> n) 86 87 { 88 89 int m,i; 90 91 cin>> m; 92 93 94 95 for (i= 0 ;i<n;i++ ) 96 97 { 98 99 100 101 cin>>SS[i].ID>>SS[i].C>>SS[i].M>> SS[i].E; 102 103 } 104 105 106 107 108 109 for (i= 0 ;i<n;i++ ) 110 111 { 112 113 SS[i].A=(SS[i].C+SS[i].M+SS[i].E)/ 3 ; 114 115 SS[i].ra= 1 ; 116 117 SS[i].rc= 1 ; 118 119 SS[i].rm= 1 ; 120 121 SS[i].re= 1 ; 122 123 } 124 125 126 127 128 129 130 131 sort(SS,SS+ n,cmp1); 132 133 int count= 1 ; 134 135 for (i= 1 ;i<n;i++ ) 136 137 { 138 139 if (SS[i].A==SS[i- 1 ].A) 140 141 { 142 143 SS[i].ra=SS[i- 1 ].ra; 144 145 count++ ; 146 147 } 148 149 else 150 151 { 152 153 SS[i].ra=SS[i- 1 ].ra+ count; 154 155 count= 1 ; 156 157 } 158 159 } 160 161 162 163 164 165 sort(SS,SS+ n,cmp2); 166 167 168 169 count= 1 ; 170 171 for (i= 1 ;i<n;i++ ) 172 173 { 174 175 if (SS[i].C==SS[i- 1 ].C) 176 177 { 178 179 SS[i].rc=SS[i- 1 ].rc; 180 181 count++ ; 182 183 } 184 185 else 186 187 { 188 189 SS[i].rc=SS[i- 1 ].rc+ count; 190 191 count= 1 ; 192 193 } 194 195 } 196 197 198 199 200 201 sort(SS,SS+ n,cmp3); 202 203 count= 1 ; 204 205 for (i= 1 ;i<n;i++ ) 206 207 { 208 209 if (SS[i].M==SS[i- 1 ].M) 210 211 { 212 213 SS[i].rm=SS[i- 1 ].rm; 214 215 count++ ; 216 217 } 218 219 else 220 221 { 222 223 SS[i].rm=SS[i- 1 ].rm+ count; 224 225 count= 1 ; 226 227 } 228 229 } 230 231 232 233 234 235 sort(SS,SS+ n,cmp4); 236 237 count= 1 ; 238 239 for (i= 1 ;i<n;i++ ) 240 241 { 242 243 if (SS[i].E==SS[i- 1 ].E) 244 245 { 246 247 SS[i].re=SS[i- 1 ].re; 248 249 count++ ; 250 251 } 252 253 else 254 255 { 256 257 SS[i].re=SS[i- 1 ].re+ count; 258 259 count= 1 ; 260 261 } 262 263 } 264 265 266 267 268 269 for (i= 0 ;i<m;i++ ) 270 271 { 272 273 string goal; int j; 274 275 cin>> goal; 276 277 for (j= 0 ;j<n;j++ ) 278 279 if (SS[j].ID==goal) break ; 280 281 282 283 if (j==n) cout<< " N/A " << endl; 284 285 else { 286 287 char high= ' E ' ; 288 289 int temp= SS[j].re; 290 291 if (temp>= SS[j].rm) 292 293 { 294 295 high= ' M ' ; 296 297 temp= SS[j].rm; 298 299 } 300 301 if (temp>= SS[j].rc) 302 303 { 304 305 high= ' C ' ; 306 307 temp= SS[j].rc; 308 309 } 310 311 if (temp>= SS[j].ra) 312 313 { 314 315 high= ' A ' ; 316 317 temp= SS[j].ra; 318 319 } 320 321 322 323 cout<<temp<< " " <<high<< endl; 324 325 } 326 327 } 328 329 } 330 331 return 0 ; 332 333 } 334 335
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
