PAT A1012 Best Rank

题目简述

现已知n个考生的3门课分数C、M、E,而平均分数A可以由这3个分数得到。现在分别按这4个分数对n个考生从高到低排序,这样对每个考生来说,就会有4个排名且每个分数都会有一个排名。接下来会有m个查询,每个查询输入一个考生的ID,输出该考生4个排名中最高的那个排名及对应是A、C、M、E中的哪一个。如果对不同课程有相同排名的情况,则按优先级 A>C>M>E 输出;如果查询的考生ID不存在,则输出N/A.

补充

1.grade用数组存,就方便后面排序。
2.由于ID是六位的整数,所以设置一个Rank[10000000][4]数组,其中Rank[id][0] ~Rank[id][4]n为4门课对应的排名
3.round() 函数返回一个数字四舍五入后最接近的整数。头文件为math.h

代码

#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;

struct Student{
	int id;//存放6位整数的ID;
	int grade[4];//存放4个分数 
}stu[2010];

char course[4] = {'A','C','M','E'};//按优先级顺序,方便输出
int Rank[10000000][4] = {0}; // Rank[id][0] ~Rank[id][4]n为4门课对应的排名
int now; //cmp函数中使用,表示当前按now 号分数排序stu数组 

bool cmp(Student a,Student b){ //数组按now号分数递减排序
	 return a.grade[now] > b.grade[now]; 
} 
 
int main()
{
	int m,n;
	scanf("%d%d",&n,&m);
	//读入分数,其中grade[0]~grade[3]分别代表A、C、M、E
	for(int i=0;i<n;i++)
	{
		scanf("%d%d%d%d",&stu[i].id,&stu[i].grade[1],&stu[i].grade[2],&stu[i].grade[3]);
		stu[i].grade[0] = round ((stu[i].grade[1] + stu[i].grade[2] + stu[i].grade[3]) / 3.0) +0.5;
		//cout<<stu[i].grade[0]<<endl;
	} 
	for(now = 0; now < 4; now++) //枚举A、C、M、E 4个中的一个 
	{
		sort(stu,stu + n,cmp); //对所有考生按该分数从大到小排序 
		Rank[stu[0].id][now] = 1; //排序完,将最高分数的设为rank1 
		for(int i=1;i<n;i++) //对于剩下的同学 
		{	
			//cout<<stu[i].grade[0]<<endl;
			if(stu[i].grade[now] == stu[i-1].grade[now]){ //若成绩与前一个的相同 
				Rank[stu[i].id][now] = Rank[stu[i-1].id][now];//那么排名也相同 
			}else{
				Rank[stu[i].id][now] = i + 1; //否则,为其设置正确的排名 
			}
		
		} 
	}
	int query; //查询的考生ID 
	for(int i=0;i<m;i++)
	{
		scanf("%d",&query);
		if(Rank[query][0] == 0){
			printf("N/A\n");
		}else{
			int k=0;
			for(int j=0;j<4;j++)
			{
				if(Rank[query][j] < Rank[query][k]){
					k = j;
				}
			}
			printf("%d %c\n",Rank[query][k],course[k]);
		}
	}
	return 0;
} 在这里插入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值