一个排序题,需要对4个分数4次排序,每次排序完成后将当前名次记录到grank数组中。做这个题之前参考了算法笔记的思路,但是它用了静态数组直接开了一个一百万*4的int数组,算了下要占15M,典型的空间换时间。。我比较喜欢动态开数组,所以自己写了一个。
不过关于成绩相等的情况题目没有说,这有点蛋疼,看了别人的博客才知道,98、90、90、88这种情况要按1,2,2,4来算。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <map>
using namespace std;
struct Student{
int name;
int grade[4];
int best;
int grank[4];
};
int N,M;
map<int,char> m;
int cmp0(const void* _a,const void * _b)
{
Student* a = (Student*)_a;
Student* b = (Student*)_b;
return a->grade[0]<b->grade[0];
}
int cmp1(const void* _a,const void * _b)
{
Student* a = (Student*)_a;
Student* b = (Student*)_b;
return a->grade[1]<b->grade[1];
}
int cmp2(const void* _a,const void * _b)
{
Student* a = (Student*)_a;
Student* b = (Student*)_b;
return a->grade[2]<b->grade[2];
}
int cmp3(const void* _a,const void * _b)
{
Student* a = (Student*)_a;
Student* b = (Student*)_b;
return a->grade[3]<b->grade[3];
}
int main()
{
m[0] = 'A';
m[1] = 'C';
m[2] = 'M';
m[3] = 'E';
scanf("%d %d",&N,&M);
Student stu[N];
for(int i = 0; i < N;i++)
{
scanf("%d %d %d %d",&stu[i].name,&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];
}
qsort(stu,N,sizeof(Student),cmp0);
for(int j = 0;j < N;j++)
{
if(j != 0 && stu[j].grade[0] == stu[j-1].grade[0])
{
stu[j].grank[0] = j;
}else
{
stu[j].grank[0] = j+1;
}
}
qsort(stu,N,sizeof(Student),cmp1);
for(int j = 0;j < N;j++)
{
if(j != 0 && stu[j].grade[1] == stu[j-1].grade[1])
{
stu[j].grank[1] = j;
}else
{
stu[j].grank[1] = j+1;
}
}
qsort(stu,N,sizeof(Student),cmp2);
for(int j = 0;j < N;j++)
{
if(j != 0 && stu[j].grade[2] == stu[j-1].grade[2])
{
stu[j].grank[2] = j;
}else
{
stu[j].grank[2] = j+1;
}
}
qsort(stu,N,sizeof(Student),cmp3);
for(int j = 0;j < N;j++)
{
if(j != 0 && stu[j].grade[3] == stu[j-1].grade[3])
{
stu[j].grank[3] = j;
}else
{
stu[j].grank[3] = j+1;
}
}
int _s;
for(int k = 0;k < M;k++)
{
scanf("%d",&_s);
bool flag = false;
int temp = 0;
int best = 0;
for(int l = 0;l<N;l++)
{
if(stu[l].name == _s)
{
flag = true;
int x = stu[l].grank[0];
//printf("%d\n",x);
temp = 1;
while(temp<4)
{
if(x>stu[l].grank[temp])
{
x = stu[l].grank[temp];
best = temp;
}
temp++;
}
printf("%d %c\n",stu[l].grank[best],m[best]);
break;
}
}
if(!flag)
{
printf("N/A\n");
}
}
return 0;
}