1012. The Best Rank (25)

xiaoxiao2021-02-28  132

题目链接:https://www.patest.cn/contests/pat-a-practise/1012


题目大意:每个人的成绩分别按三门课的成绩和平均成绩排名,输出要查找的学生的最好排名和该排名对于的科目。


解题思路:

用0,1,2,3分别表示A,C,M,E用三门课的总分表示平均分(就不要考虑四舍五入的问题了)在学生结构体中定义rank[4]分量,表示该学生的A,C,M,E的排名先计算每个学生在特定排序下名次,然后计算每个学生的最好排名的科目

代码如下:

#include <iostream> #include <algorithm> #include <cstdio> using namespace std; struct Student { int id,bestcourse;//学号,和排名最好的课的课程号。0,1,2,3分别代表A,C,M,E其中A表示三门成绩之和 int grade[4],rank[4];//每门的成绩和每门课的排名 }; int flag[1000000],course; bool cmp1(Student a,Student b){ return a.grade[course]>b.grade[course]; } int main(int argc, char const *argv[]) { int N,K; cin>>N>>K; Student st[N]; for(int i=0;i<N;i++){ cin>>st[i].id>>st[i].grade[1]>>st[i].grade[2]>>st[i].grade[3];//输入每门课成绩 st[i].grade[0]=st[i].grade[1]+st[i].grade[2]+st[i].grade[3];//计算总成绩 } /*计算每个学生每门课的排名*/ for(course=0;course<=3;course++){ sort(st,st+N,cmp1); st[0].rank[course]=1; for(int j=1;j<N;j++){ st[j].rank[course]=j+1; if(st[j].grade[course]==st[j-1].grade[course]) st[j].rank[course]=st[j-1].rank[course];//成绩相同的名次相同 } } /*计算每个学生的最好排名的科目*/ for(int i=0;i<N;i++){ st[i].bestcourse=0; flag[st[i].id]=i+1;//将该学生在st[]数组中的下标保存起来 int bestrank=st[i].rank[0]; for(int j=1;j<=3;j++){ if(st[i].rank[j]<bestrank){ bestrank=st[i].rank[j]; st[i].bestcourse=j; } } } char c[5]={'A','C','M','E'}; int tmpno; for(int i=0;i<K;i++){ cin>>tmpno; if(flag[tmpno]){ int best=st[flag[tmpno]-1].bestcourse;//获得排名最好的课程号 cout<<st[flag[tmpno]-1].rank[best]<<" "<<c[best]<<endl; } else cout<<"N/A"<<endl; } return 0; }
转载请注明原文地址: https://www.6miu.com/read-22356.html

最新回复(0)