其他分享
首页 > 其他分享> > PAT甲级1012,选择排序,测试点分析

PAT甲级1012,选择排序,测试点分析

作者:互联网

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;
}

标签:positionmax,PAT,函数,测试点,int,排序,stuid,1012,subject
来源: https://blog.csdn.net/weixin_51117781/article/details/122017098