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

