PAT-1012 The Best Rank 雨点打透心脏的1/2处 2023-05-29 11:45 1阅读 0赞 **解题思路:** 1.对于每个学生,rank记录最佳排名,tag记录对应的科目 2.对于题中的排名优先级顺序,A>C>M>E,可以按顺序排序,然后判断rank,如果变小了,更新rank和tag,大于等于则不更新 3.输出结果是以学生id作为依据,所以我们还需要将每个学生以id为索引存入map中 4.对于每个输入的id,调用map中count函数,判断是否存在这个索引,不存在输出N/A,否则输出 #include<iostream> #include<string> #include<vector> #include<map> #include<algorithm> using namespace std; struct st{ string id; int c,m,e,sum; int rank;//记录最佳排名 char tag;//最佳排名的科目 st(){ rank=666666; } }; bool cmpa(st a,st b){ return a.sum>b.sum;} bool cmpc(st a,st b){ return a.c>b.c;} bool cmpm(st a,st b){ return a.m>b.m;} bool cmpe(st a,st b){ return a.e>b.e;} int main() { int n,m; cin>>n>>m; vector<st> student(n); for(int i=0;i<n;i++)//读入n个学生的成绩 { cin>>student[i].id>>student[i].c>>student[i].m>>student[i].e; student[i].sum=student[i].c+student[i].m+student[i].e; } sort(student.begin(),student.end(),cmpa); int pre;//记录上一个人的名次 for(int i=0;i<n;i++)//比较平均分 { int t;//记录当前学生的名次 if(i!=0&&student[i].sum==student[i-1].sum)t=pre; else t=i+1; if(t<student[i].rank) { student[i].rank=t; student[i].tag='A'; } pre=t; } sort(student.begin(),student.end(),cmpc); for(int i=0;i<n;i++)//比较c语言分数 { int t;//记录当前学生的名次 if(i!=0&&student[i].c==student[i-1].c)t=pre; else t=i+1; if(t<student[i].rank) { student[i].rank=t; student[i].tag='C'; } pre=t; } sort(student.begin(),student.end(),cmpm); for(int i=0;i<n;i++)//比较数学成绩 { int t; if(i!=0&&student[i].m==student[i-1].m)t=pre; else t=i+1; if(t<student[i].rank) { student[i].rank=t; student[i].tag='M'; } pre=t; } sort(student.begin(),student.end(),cmpe); for(int i=0;i<n;i++)//比较英语成绩 { int t; if(i!=0&&student[i].e==student[i-1].e)t=pre; else t=i+1; if(t<student[i].rank) { student[i].rank=t; student[i].tag='E'; } pre=t; } map<string,st> xsb;//以id为下标存储每个学生的信息 for(int i=0;i<n;i++) { xsb[student[i].id]=(student[i]); } string judge; while(m--) { cin>>judge; if(xsb.count(judge)) { cout<<xsb[judge].rank<<" "<<xsb[judge].tag<<endl; } else cout<<"N/A"<<endl; } return 0; }
还没有评论,来说两句吧...