排序题
带***的为参考算法笔记的解法,非完全自己构思。
心得:
不要害怕sort改变了数组顺序
可以用自己的rank数组记录结果。
error: reference to ‘rank’ is ambiguous
错误是函数重复了,修改了首字母变成大写。
利用数组来记录优先级,便于输出
因为只要排名,平均分可以直接用总分代替
#include <cstdio>
#include <algorithm>
using namespace std;
typedef struct Node
{
int ID;
int grade[4];
}student;
int now= -1;
char s[4]={'A','C','M','E'};
int Rank[1000000][4] = {0};
bool cmp(student a,student b)
{
return a.grade[now] > b.grade[now];
}
int main(int argc, char** argv) {
int n,m;
int check[10000];
scanf("%d %d",&n,&m);
student stu[n];
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];
}
for(now = 0;now<4;now++)
{
sort(stu,stu+n,cmp);
Rank[stu[0].ID][now] = 1;
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;
}
}
for(int i =0;i<m;i++)
{
scanf("%d",&check[i]);
}
for(int i =0;i<m;i++)
{
int temp = 9999;
int index = -1;
for(int j = 0;j<4;j++)
{
if(Rank[check[i]][j] == 0)
break;
if(temp > Rank[check[i]][j])
{
temp = Rank[check[i]][j];
index = j;
}
// else if(temp == Rank[check[i]][j])
}
if(temp!=9999)
printf("%d %c\n",temp,s[index]);
else
printf("N/A\n");
}
return 0;
}
在这里插入代码片