1012 The Best Rank
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 Algrbra), 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.
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.
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
.
- 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
- 1 C
- 1 M
- 1 E
- 1 A
- 3 A
- N/A
代码:
学到的东西:
像这题,题目要求求出每一门成绩的排名(结构体存储名字,各科成绩),这是需要用到排序的但是直接使用排序是不能将每一科的成绩都进行排名的,可以把各个科目的成绩存在一个数组中,在对每一科进行排名时,用flag表示当前正在排名哪一个科目,cmp函数也可以直接对score数组中国的第flag门进行排序,最后得到每一门成绩的排名
- #include
- #include
- using namespace std;
-
- const int N=2010;
- int exist[1000000];
- int flag=-1;
- int n,m;
-
- struct stu{
- int name,best;//best存的是这位同学最好的成绩排名的下标,表示哪一门科目
- int score[4],rank[4];//score表示每一门的成绩,rank表示每一门的排名
- }s[N];
-
- bool cmp(stu a,stu b){
- return a.score[flag]>b.score[flag];
- }
-
- int main(){
- cin >> n >> m;
-
- for(int i=0;i
- scanf("%d%d%d%d",&s[i].name,&s[i].score[1],&s[i].score[2],&s[i].score[3]);
- s[i].score[0]=(s[i].score[1]+s[i].score[2]+s[i].score[3])/3.0+0.5;
- }
-
- //将每一门成绩排名
- for(int i=0;i<4;i++){
- flag=i;//flag表示当前排序的是哪一门科目
- sort(s,s+n,cmp);
- s[0].rank[flag]=1;
- for(int j=1;j
- s[j].rank[flag]=j+1;
- if(s[j].score[flag]==s[j-1].score[flag])
- s[j].rank[flag]=s[j-1].rank[flag];
- }
- }
-
- //找到每一个人的排名
- //可以这样理解:为了避免多余的循环查找,利用一个数组将ID和对应结构体下标联系起来了,
- //数组下标表示ID,值表示对应的下标,这里还为了判断当前人是否存在,所以默认对应下标值0的人不存在
- for(int i=0;i
- exist[s[i].name]=i+1;//将id用数组表示,这样在后面判断需要查找的ID是否存在就不要用循环查找了
- //还有一个有点是,因为题目给出的是需要ID,需要找到这个ID对应的排名又是需要用到循环查找的,用exist数组还表示了对应ID在结构体中的下标
- s[i].best=0;
- int minn=s[i].rank[0];
- for(int j=1;j<4;j++){
- if(minn>s[i].rank[j]){
- minn=s[i].rank[j];
- s[i].best=j;
- }
- }
- }
-
- int id;
- char word[]={'A','C','M','E'};
- for(int i=0;i
- scanf("%d",&id);
- int temp=exist[id];
- if(temp){
- int best=s[temp-1].best;
- printf("%d %c\n",s[temp-1].rank[best],word[best]);
- }
- else printf("N/A\n");
- }
-
- return 0;
- }
好好学习,天天向上!
我要考研!
-
相关阅读:
MIMO-UNet复现,DeepRFT复现及总结
竞赛选题 大数据商城人流数据分析与可视化 - python 大数据分析
【校招VIP】前端专业课考点之CSMA/CD协议
【XXL-JOB】1.docker-compose 安装 调配中心
推荐 3 个腾讯开源的 GitHub 项目
【超好懂的比赛题解】2022CCPC四川省赛 个人题解
FMC子卡设计方案:FMC177-基于AD9361的双收双发射频FMC子卡
前端面试题50(有哪些常见的前端安全措施可以防止CSRF攻击?)
SSH智能社区住户信息管理系统
00后最关注程序员,超8成人接受灵活就业,视频UP主是最想从事的职业
-
原文地址:https://blog.csdn.net/weixin_50679551/article/details/126804187