【一只蒟蒻的刷题历程】 【PAT】 A1012 最佳排名

题意:

为了评估CS专业一年级学生的表现,我们仅考虑他们的三门课程成绩:C-C编程语言,M-数学(微积分或线性代数)和E-英语。同时,我们通过强调学生的最佳成绩来鼓励学生-也就是说,就三门课程和平均成绩而言,在四个成绩中,我们为每个学生打印最佳成绩。

例如,C,M,E和A的成绩-四个学生的平均成绩如下:

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

那么,所有学生的最佳成绩是第一名,因为第一名的学生在C编程语言方面的表现最好,而第二名的数学水平最高,第三名的英语水平最高,平均最后一位。

输入规格:

每个输入文件包含一个测试用例。每种情况都从包含2个数字N和M(≤2000)的行开始,这两个数字分别是学生总数和要检查其排名的学生人数。然后,N行跟随,每行包含一个由6位数字组成的字符串的学生ID,然后按C,M和E的顺序跟随该学生的三个整数等级(在[0,100]范围内)。是M行,每行包含一个学生ID。

输出规格:

对于M个学生中的每一个,在一行中打印出最适合他/她的等级,以及相应等级的符号,并用空格隔开。

排名方法的优先级顺序为A> C> M>E。因此,如果有两种或多种方法让学生获得相同的最佳排名,请输出优先级最高的一种。

如果学生不在评分列表中,只需输出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

思路:

这代码是从算法笔记这本书上学来的
排名优先级:A > C > M > E

排名会有相同的,要处理(一开始自己写代码,打算刚开始结构体的score数组用来存分数,后面经过排名后再用来存储排名,十分不方便,比如id在结构体里面,还有排名会有相同,改完排名后上一个用来作比较的就不在了,总之很麻烦)

所以还是单独用一个数组来记录排名好,虽然很浪费空间,但是很方便,还有这个cmp我当时分开写了四个,现在这个循环下标就很好。。。

代码:

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;  //(从算法笔记上学来的,比自己写的少了很多坑) 
struct node{
	int id;
	int score[4];  //分数 A C M E
}stu[2050];

int now; //cmp的排序方法(按哪种分数排序)  
bool cmp(node a,node b)
{
	return a.score[now]>b.score[now];  //分数大到小 
} 

char course[4]={'A','C','M','E'}; //课程 (按优先级) 
int pai[10000000][4]={0}; //每个学生的四种排名 ,pai[学号][课程类型] = 排名
int n,m;

int main() 
{ 
  cin>>n>>m;
  for(int i=0;i<n;i++)
  {
  	 cin>>stu[i].id>>stu[i].score[1]>>stu[i].score[2]>>stu[i].score[3]; 
  	 stu[i].score[0]=(stu[i].score[1]+stu[i].score[2]+stu[i].score[3])/3; //平均分 
  }
  for(now=0;now<=3;now++)
  {
  	 sort(stu,stu+n,cmp);
  	 pai[stu[0].id][now] = 1; // 该排序类型的第一名 pai[学号][课程类型] = 排名 
  	 for(int i=1;i<n;i++) 
  	 {
  	 	if(stu[i].score[now] == stu[i-1].score[now])
  	 		pai[stu[i].id][now] = pai[stu[i-1].id][now];
        else 
            pai[stu[i].id][now]=i+1;
     }  
  } 
  
  int cha;
  while(m--)
  {
  	cin>>cha;
  	if(pai[cha][0]==0)  //没排名,id不存在 
  	 cout<<"N/A"<<endl;
  	else
	  {
	  	 int j=0; //假设最好排名是第一门课程 
	  	 for(int i=1;i<4;i++) //与后面三门对比 
	  	 {
	  	 	if(pai[cha][i]<pai[cha][j])
	  	 	  j=i;
		   }
		   cout<<pai[cha][j]<<" "<<course[j]<<endl; //找到排名最高的(数字最小) 
	  } 
  }
  return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值