PAT1012
题目大坑,注意排名规则,题目没有说清楚,90 85 85 80 的排名不是1 2 3 4 而是1 2 2 4 注意并列!
1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #include<map> 5 #include<algorithm> 6 #include<iterator> 7 using namespace std; 8 9 struct VNode 10 { 11 string id; 12 double grade; 13 }; 14 15 double round(double num) 16 { 17 int n =(int)num+1; 18 if(num + 0.5 >= n) 19 return (double)n; 20 else 21 return (double)n-1; 22 } 23 24 struct MNode 25 { 26 int c_rank; 27 int m_rank; 28 int e_rank; 29 int a_rank; 30 }; 31 32 bool comp(VNode n1, VNode n2) 33 { 34 if(n1.grade > n2.grade) 35 return true; 36 else 37 return false; 38 } 39 40 int best (MNode p, char &ch) 41 { 42 int q[4]={p.a_rank, p.c_rank, p.m_rank, p.e_rank}; 43 int rank = 10000, index; 44 for(int i=0; i<4; ++i) 45 if(q[i] < rank) 46 { 47 rank = q[i]; 48 index = i; 49 } 50 switch (index) 51 { 52 case 0: {ch = 'A';break;} 53 case 1: {ch = 'C';break;} 54 case 2: {ch = 'M';break;} 55 case 3: {ch = 'E';break;} 56 } 57 return rank; 58 } 59 60 int main() 61 { 62 int enroll, check; 63 while(cin>>enroll>>check) 64 { 65 vector<VNode> C, M, E, A; 66 vector<string> checklist(check); 67 for(int i=0; i<enroll; ++i) 68 { 69 string id; double c, m ,e ,a; 70 cin>>id>>c>>m>>e; 71 a = round((c+m+e)/3); 72 VNode cn={id,c}; C.push_back(cn); 73 VNode mn={id,m}; M.push_back(mn); 74 VNode en={id,e}; E.push_back(en); 75 VNode an={id,a}; A.push_back(an); 76 } 77 for(int i=0; i<check; ++i) 78 cin>>checklist[i]; 79 80 stable_sort(C.begin(), C.end(), comp); 81 stable_sort(M.begin(), M.end(), comp); 82 stable_sort(E.begin(), E.end(), comp); 83 stable_sort(A.begin(), A.end(), comp); 84 85 map<string, MNode> ranklist; 86 87 for(int i=0; i<C.size(); ++i) 88 if(i != 0) 89 { 90 if(C[i].grade == C[i-1].grade) 91 ranklist[C[i].id].c_rank = ranklist[C[i-1].id].c_rank; 92 else 93 ranklist[C[i].id].c_rank = i+1; 94 } 95 else 96 ranklist[C[i].id].c_rank = i+1; 97 /*处理并列排名,天坑啊,题目压根没说*/ 98 for(int i=0; i<M.size(); ++i) 99 if(i != 0) 100 { 101 if(M[i].grade == M[i-1].grade) 102 ranklist[M[i].id].m_rank = ranklist[M[i-1].id].m_rank; 103 else 104 ranklist[M[i].id].m_rank = i+1; 105 } 106 else 107 ranklist[M[i].id].m_rank = i+1; 108 109 for(int i=0; i<E.size(); ++i) 110 if(i != 0) 111 { 112 if(E[i].grade == E[i-1].grade) 113 ranklist[E[i].id].e_rank = ranklist[E[i-1].id].e_rank; 114 else 115 ranklist[E[i].id].e_rank = i+1; 116 } 117 else 118 ranklist[E[i].id].e_rank = i+1; 119 120 for(int i=0; i<A.size(); ++i) 121 if(i != 0) 122 { 123 if(A[i].grade == A[i-1].grade) 124 ranklist[A[i].id].a_rank = ranklist[A[i-1].id].a_rank; 125 else 126 ranklist[A[i].id].a_rank = i+1; 127 } 128 else 129 ranklist[A[i].id].a_rank = i+1; 130 131 for(int i=0; i < checklist.size(); ++i) 132 { 133 map<string, MNode>::iterator iter = ranklist.find(checklist[i]); 134 if( iter == ranklist.end()) 135 cout<<"N/A"<<endl; 136 else 137 { 138 char ch; 139 int b = best(iter->second,ch); 140 cout<<b<<" "<<ch<<endl; 141 } 142 } 143 } 144 return 0; 145 }