1012. The Best Rank (25)

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

题目:

 
 
 
时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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 Algebra), 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.

Input

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.

Output

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".

Sample Input
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
Sample Output
1 C
1 M
1 E
1 A
3 A
N/A

 

分析:

题目要求对于一个学生的各项成绩记录,输出每位同学的最好成绩排名和相应科目(并且科目也有优先级:平均成绩高于电脑成绩,高于数学成绩,高于英语成绩)。而注意到,一个单一的排序算法只能找出每位同学某一项或某一方面的成绩好坏,所以需要有多个排序函数,进行多次排序,并且还要记录每次排序后每位同学的各科目排名。

注意点:是会有同分的情况,所以针对99 99 88 88 85的情况,实际排名应该是1 1 3 3 5。而不是1 2 3 4 5或1 1 2 2 3。

案例分析:

对于5条记录(5位同学)的6条查询。

名字  电脑 数学 英语 平均  结果

310101  1 5 4 2 输出的应该是1 C

310102  5 1 4 5   输出1 M

310103  4 4 1 4   输出1 E

310104  2 2 2 1   输出1 A

310105  3 3 3 3   输出 3 A

999999  不存在   输出 N/A



AC代码:

 

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct Student{
 int num;
 int name;
 int C_score;
 int M_score;
 int E_score;
 int A_score;
}buf[2001];//学生结构体,存储各项分数和名字
int ans[2001][4];//*用来存储各学生各项分数的排名
char c[4] = {
 'C','M','E','A'
};
int str;
bool cmp1(Student S1,Student S2){
 return (S1.C_score > S2.C_score);
}//电脑分数的排序方法
bool cmp2(Student S1,Student S2){
 return (S1.M_score > S2.M_score);
}//数学分数的排序方法
bool cmp3(Student S1,Student S2){
 return (S1.E_score > S2.E_score);
}//英语分数的排序方法
bool cmp4(Student S1,Student S2){
 return (S1.A_score > S2.A_score);
}//平均分数的排序方法
int main(void){
 int n,m,i;
 while(scanf("%d%d",&n,&m) != EOF){
  for(i = 0; i < n; i ++){
   scanf("%d%d%d%d",&buf[i].name,&buf[i].C_score,&buf[i].M_score,&buf[i].E_score);
   buf[i].A_score = (buf[i].C_score + buf[i].M_score + buf[i].E_score ) / 3;//计算出平均成绩
   buf[i].num = i;
  }//接收数据
  sort(buf, buf + n, cmp1);//按电脑分数高低进行排序
  ans[buf[0].num][0] = 1;
  for(i = 1; i < n; i ++){
   if(buf[i].C_score == buf[i - 1].C_score){
    ans[buf[i].num][0] = ans[buf[i - 1].num][0];
   }//如果分数相同,则和前面同学的排名相同
   else ans[buf[i].num][0] = i + 1;
  }//每位学生电脑成绩的排名
  sort(buf, buf + n, cmp2);//按数学分数高低进行排序
  ans[buf[0].num][1] = 1;
  for(i = 1; i < n; i ++){
   if(buf[i].M_score == buf[i - 1].M_score){
    ans[buf[i].num][1] = ans[buf[i - 1].num][1];
   }//如果分数相同,则和前面同学的排名相同
   else ans[buf[i].num][1] = i + 1;
  }//每位学生数学成绩的排名
  sort(buf, buf + n, cmp3);//按英语分数高低进行排序
  ans[buf[0].num][2] = 1;
  for(i = 1; i < n; i ++){
   if(buf[i].E_score == buf[i - 1].E_score){
    ans[buf[i].num][2] = ans[buf[i - 1].num][2];
   }/如果分数相同,则和前面同学的排名相同
   else ans[buf[i].num][2] = i + 1;
  }//每位学生英语成绩的排名
  sort(buf, buf + n, cmp4);//按平均分数高低进行排序
  ans[buf[0].num][3] = 1;
  for(i = 1; i < n; i ++){
   if(buf[i].A_score == buf[i - 1].A_score){
    ans[buf[i].num][3] = ans[buf[i - 1].num][3];
   }/如果分数相同,则和前面同学的排名相同
   else ans[buf[i].num][3] = i + 1;
  }//每位学生平均成绩的排名
  bool flag;
  for(i = 0; i < m; i ++){
   scanf("%d",&str);
   flag = false;//是否存在对应名字的学生的标志
   for(int j = 0; j < n; j ++){
    if(buf[j].name == str){
     int order = buf[j].num;
     if(ans[order][3] <= ans[order][0] && ans[order][3] <= ans[order][1] && ans[order][3] <= ans[order][2]){
//如果该同学平均成绩排名最好
      printf("%d %c\n",ans[order][3],c[3]);
      flag = true;
      break;
     }
     else if(ans[order][0] <= ans[order][1] && ans[order][0] <= ans[order][2]){
//否则如果该同学电脑成绩排名最好
      printf("%d %c\n",ans[order][0],c[0]);
      flag = true;
      break;
     }
     else if(ans[order][1] <= ans[order][2]){
//否则如果该同学数学成绩排名最好
      printf("%d %c\n",ans[order][1],c[1]);
      flag = true;
      break;
     }
     else {//最后就按英语成绩的排名来
      printf("%d %c\n",ans[order][2],c[2]);
      flag = true;
      break;
     }
    }
   }
   if(flag == false){//如果不存在编号
    puts("N/A");
   }
  }
 }
 return 0;
}

——Apie陈小旭

城市运行管理的重要性与挑战 城市运行体系是以人为本的服务和经济发展体系,涉及决策、管理和执行三个层次。当前城市运行管理面临城市化快速发展、资源环境制约和社会矛盾突出等挑战。信息技术的发展为城市运行管理提供了重要手段,城市信息化经历了数字化、智能化到智慧化的发展过程。我国城市信息化虽取得进展,但仍处于初级阶段,存在缺乏整体规划、资源浪费和协作效率不高等问题。 智慧城市综合运行管理解决方案 智慧城市运行管理中心(SCOC)是支撑城市运行综合管理的神经中枢,旨在掌控城市运行综合体征,促进服务型政府转型。该中心通过全面整合运行资源,服务城市未来发展,提升城市运行水平和突发事件处置效率。中心纵向提升综合职能,横向贯通专业分工,包括综合管理平台、专业管理平台和业务操作平台,覆盖城市交通、公共安全、生态环境等多个领域。 智慧城市综合运行管理平台的结构与功能 智慧城市综合运行管理平台包括决策支持系统、处置系统、基础设施和监测系统。平台通过综合展现系统、综合应急指挥系统、综合运行业务联动系统等,实现城市运行的综合监测和管理。物联网数据采集系统利用网络通讯技术,实现城市物联网设备的高效运行。平台还包含云计算业务支撑系统、城市基础数据库、视频图像云平台等,以支持城市运行管理的各个方面。 智慧城市综合运行管理解决方案的优势 该解决方案具有三个核心优势:首先,它提供了完整的智慧城市视角,不仅仅是指挥中心或数据中心,而是智慧城市的实际载体。其次,它建立了完整的城市运行联动体系,打通业务部门壁垒,形成有机融合的业务联动平台,提升业务处理效率和服务水平。最后,方案凝聚了多年智慧城市建设咨询经验,为城市运行管理提供了成熟的解决方案。 项目实施建议 智慧城市运行管理中心的建设思路和项目实施建议是方案的重要组成部分,旨在指导城市如何有效实施智慧城市运行管理解决方案,以应对城市运行管理的挑战,提升城市管理的智能化和效率。通过这些建议,城市能够更好地规划和实施智慧城市项目,实现可持续发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值