PAT 甲级1012是一道排序的题,我没有如大多数人一样选择适用sort函数,而是使用了选择排序的方法写了一个函数。
这个函数需要三个参数,第一个参数是需要排序的数组的指针。第二个参数是需要排序的数组的size。第三个参数也是一个数组的指针,数组下标0、1、2分别对应第一、二、三个学生,以此类推,值在main函数中没有被初始化,经过选择函数操作进行赋值,相应的值就是这个学生该成绩的排名。
在main函数中调用排序函数四次,函数就可以生成四个分别对应A、C、M、E的排名数组,下标与学生id一一对应,第一个学生就可以通过下标0查看其排名,以此类推。
5个测试点中,如果没有对相同成绩的情况进行处理,2、3测试点会通不过,我在排序函数中的最后进行了专门处理。
交流可加QQ:1724330748
#include<iostream>
#include<cstring>
void xuanze(int *subject, int N, int *subrank);
using namespace std;
void xuanze(int *subject, int N, int*subrank)
{
int stuid[N];for(int i=0;i<N;i++){stuid[i]=i;}
for(int i=0;i<N;i++){
int positionmax=i;
for(int loca=i;loca<N;loca++){
if(subject[loca]>subject[positionmax])positionmax=loca;}
int temp1=subject[i];
subject[i]=subject[positionmax];
subject[positionmax]=temp1;
int temp2=stuid[i];
stuid[i]=stuid[positionmax];
stuid[positionmax]=temp2;}
for(int ID=0;ID<N;ID++){for(int j=0;j<N;j++){if(stuid[j]==ID)subrank[ID]=j;}}
for(int sameid=0;sameid<N-1;sameid++){
if(subject[sameid]==subject[sameid+1])
{
//一个名次是sameid,一个名次是sameid+1
int tempid1, tempid2;
for(int i=0;i<N;i++){if(subrank[i]==sameid)tempid1=i;}
for(int i=0;i<N;i++){if(subrank[i]==sameid+1)tempid2=i;}
subrank[tempid2]=subrank[tempid1];
}
}
}
int main()
{
int N, M, i, j, k, l;
cin>>N>>M;
string stuida[N], stuidb[M];
int Cp[N], Ma[N], En[N];
for(i=0;i<N;i++){
cin>>stuida[i]>>Cp[i]>>Ma[i]>>En[i];
}
for(j=0;j<M;j++){
cin>>stuidb[j];
}
int An[N];
for(k=0;k<N;k++){An[k]=(Cp[k]+Ma[k]+En[k])/3;}
int Anrank[N],Cprank[N],Marank[N],Enrank[N];
xuanze(An,N,Anrank);
xuanze(Cp,N,Cprank);
xuanze(Ma,N,Marank);
xuanze(En,N,Enrank);
for(l=0;l<M;l++){
bool cunzai=false;
for(int o=0;o<N;o++){
if(stuidb[l]==stuida[o]){
cunzai=true;
char bestsub='A';
int bestrank=Anrank[o]+1;
if(Cprank[o]+1<bestrank){bestsub='C';bestrank=Cprank[o]+1;}
if(Marank[o]+1<bestrank){bestsub='M';bestrank=Marank[o]+1;}
if(Enrank[o]+1<bestrank){bestsub='E';bestrank=Enrank[o]+1;}
cout<<bestrank<<" "<<bestsub<<endl;
}
}
if(cunzai==false)cout<<"N/A"<<endl;
}
return 0;
}