PAT 1012

题目 : The Best Rank

分值 : 25
难度 : 常规题
思路 : 四个数找最小,?: ; 然后就是排序问题都会碰到的同名次问题,处理机制。
坑点 : 排序问题:同名次问题,就是类似两个人并列第一这种情况
评语 : 挺简单的常规题,写的代码有点冗余了,能AC就懒得改了.....

具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <iostream>
using namespace std ;
typedef struct Node{
int id ;
int C , M ,E , A ;
int ra,rc,rm,re;
}Nodes ;
Nodes data[20001] ;
int flag[1000000] ;
int cmp1( const void *a , const void * b )
{
return ((Nodes*)b)->C - ((Nodes*)a)->C ;
}
int cmp2( const void *a , const void * b )
{
return ((Nodes*)b)->M - ((Nodes*)a)->M ;
}
int cmp3( const void *a , const void * b )
{
return ((Nodes*)b)->E - ((Nodes*)a)->E ;
}
int cmp4( const void *a , const void * b )
{
return ((Nodes*)b)->A - ((Nodes*)a)->A ;
}
int main() {
int N ,M ;
cin >> N>> M ;
for(int i = 0 ; i< 1000000;i++)
flag[i] = -1 ;
for(int i = 0 ; i< N ;i++)
{
int id , c ,m ,e ,a ;
cin>> id >>c >>m >>e ;
//flag[id] = i ;
a = (c+m+e)/3 ;
data[i].id = id ;
data[i].C = c ;
data[i].M = m ;
data[i].E = e ;
data[i].A = a ;
}
qsort(data, N ,sizeof(data[0]) ,cmp1) ;
for(int i = 0 ; i< N ;i++)
{
if(!i)
data[i].rc = i+1 ;
else
{
if(data[i].C == data[i-1].C)
data[i].rc = data[i-1].rc ;
else
data[i].rc = i+1 ;
}
}
qsort(data, N ,sizeof(data[0]) ,cmp2) ;
for(int i = 0 ; i< N ;i++)
{
if(!i)
data[i].rm = i+1 ;
else
{
if(data[i].M == data[i-1].M)
data[i].rm= data[i-1].rm;
else
data[i].rm = i+1 ;
}
}
qsort(data, N ,sizeof(data[0]) ,cmp3) ;
for(int i = 0 ; i< N ;i++)
{
if(!i)
data[i].re = i+1 ;
else
{
if(data[i].E == data[i-1].E)
data[i].re = data[i-1].re ;
else
data[i].re = i+1 ;
}
}
qsort(data, N ,sizeof(data[0]) ,cmp4) ;
for(int i = 0 ; i< N ;i++)
{
if(!i)
data[i].ra = i+1 ;
else
{
if(data[i].A == data[i-1].A)
data[i].ra = data[i-1].ra ;
else
data[i].ra = i+1 ;
}
}
for(int i = 0 ; i< N ;i++)
{
flag[data[i].id] = i ;
}
for(int i = 0 ; i< M ;i++)
{
int temp ;
cin >> temp ;
int cur = flag[temp];
if(cur !=-1)
{
int ra = data[cur].ra ;
int rc = data[cur].rc ;
int rm = data[cur].rm ;
int re = data[cur].re ;
int small = ((ra<rc ? ra:rc) < rm ? (ra<rc ? ra:rc):rm ) < re ? ((ra<rc ? ra:rc) < rm ? (ra<rc ? ra:rc):rm ):re ;
cout<<small<<" ";
if(small == ra)
cout<<"A"<<endl ;
else if(small == rc)
cout <<"C"<<endl ;
else if(small == rm)
cout <<"M"<<endl ;
else if(small == re)
cout <<"E"<<endl ;
}
else
cout << "N/A"<<endl ;

}
}