#include<iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<algorithm> #include<map> #include<vector> #include<queue> #include<cmath> using namespace std; key:Rank[id][0]~Rank[id][4]为编号为id的考生四门课对应的排名,另:course[]数组分别存ACME 对结构体的理解,!4次排序 -for!,结构体内的grade是数组,排名相同则后者居"后" 注意这题cmp,now为全局变量,不用传参进去 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]为四门课对应的排名 int now; //cmp函数中使用,表示当前按now号分数排序stu数组 bool cmp(Student a,Student b){ //stu数组按now号分数递减排序 return a.grade[now] > b.grade[now] ; } int main(){ int n,m; 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]= (stu[i].grade[1] +stu[i].grade[2]+stu[i].grade[3])/3.0+0.5; //四舍五入 //上面的这里我没用晴神的四舍五入方法(没看懂hhh) } 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++){ //对于剩下的考生 //若与前一位考生分数相同 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){ //如果这个考生ID不存在(这里看是否0分emm但是感觉考生可能考鸭蛋),则输出"N/A" printf("N/A\n"); }else{ int k=0; //选出Rank[query][0~3]中最小的rank值最小,排名越高 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]); } } system("pause"); return 0; }
PS:看到有两个大佬用容器,先mark,此坑日后补上