美文网首页
1012 The Best Rank

1012 The Best Rank

作者: 胖胖的熊管家 | 来源:发表于2020-05-26 10:32 被阅读0次

    题目

    对学生的成绩进行排序。优先级为:A>C>M>E.
    输入:

    行数 数字 含义
    第一行 N 学生数 M 要排序的学生数
    第二行 student ID(6位) C M E
    第...行 student ID C M E
    第2+N行 student ID C M E
    第2+N+1行 student ID
    第2+N+...行 student ID
    第2+N+M行 student ID

    输出:
    按顺序输出每个学生的最佳排名,及是什么的排名。
    没有这个学生的话,就输出N/A。
    (刚开始理解错了题意,以为是对每个同学自己成绩的排序;后来input不符合,再次理解才发现是按C,M,E,A类别的成绩来排序)

    Sample Input
    5 6
    310101 98 85 88
    310102 70 95 88
    310103 82 87 94
    310104 91 91 91
    310105 85 90 90
    310101
    310102
    310103
    310104
    310105
    999999
    
    Sample Output
    1 C
    1 M
    1 E
    1 A
    3 A
    N/A
    

    解法

    法一:C++
    思路:

    每一行存储,
    每一列比较大小

    源代码:
      #include <iostream>
    #include <cstdio>
    #include <math.h>
    #include<vector>
    #include <string.h>
    #include <sstream>
    #include<algorithm>
    using namespace std;
    
    int average(int a,int b,int c){
        int ave=0;
        ave = (a+b+c) / 3;
        return ave;
    }
    
    struct students{
        string id;
        int score[4];
        int rank[4];
        int min;
    };
    students stu[2000];
    
    bool compare(int a,int b)
    {
        return a>b;
    }
    int main() {
        int n,m;
        scanf("%d %d",&n,&m);
        string id;
        int c,math,english,ave;
        int cgr[2002],agr[2002],mgr[2002],egr[2002];
        for(int i=0;i<n;i++){
            cin>>id;
            scanf("%d %d %d",&c,&math,&english);
            ave = average(c, math, english);
            stu[i].id = id;
            stu[i].score[0]=ave;
            stu[i].score[1]=c;
            stu[i].score[2]=math;
            stu[i].score[3]=english;
            cgr[i]=c;
            mgr[i]=math;
            egr[i]=english;
            agr[i]=ave;
        }
        sort(cgr,cgr+n,compare);
        sort(mgr,mgr+n,compare);
        sort(egr,egr+n,compare);
        sort(agr,agr+n,compare);
        
        //找到从大到小排序后,原序列的index
        int flag=0;
        int rankindex=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                rankindex = j;
    //            flag = false;
    //            if(stu[i].score[3] == egr[j]){
    //                flag++;
    //            }
    //            if(stu[i].score[2] == mgr[j]){
    //                flag++;
    //            }
    //            if(stu[i].score[1] == cgr[j]){
    //                flag++;
    //            }
    //            if(stu[i].score[0] == agr[j]){
    //                flag++;
    //            }
                
                
                if(stu[i].score[3] == egr[j]){
                    stu[i].rank[3] = j;
                }
                if(stu[i].score[2] == mgr[j]){
                    stu[i].rank[2] = j;
                }
                if(stu[i].score[1] == cgr[j]){
                    stu[i].rank[1] = j;
                }
                if(stu[i].score[0] == agr[j]){
                    stu[i].rank[0] = j;
                }
                
                
            }
        }
        //找出每个学生排名最小的index
        int temp;
        for(int i=0;i<n;i++){
            temp=9999;
            for(int j=0;j<4;j++){
                if(stu[i].rank[j]<temp){
                    temp=stu[i].rank[j];
                    stu[i].min=j;
                }
            }
        }
        
        //输出结果
        char subjects[5] = {'A', 'C', 'M', 'E'};
        int index;
        for(int i=0;i<m;i++){
            if(stu[i].id.length() == 6){
                index = stu[i].min;
                cout<<stu[i].rank[index]+1<<" "<<subjects[index]<<endl;
            }
            else{
                cout<<"N/A"<<endl;
            }
        }
        
        return 0;
    
    }
    
    

    很久很久后,AC的代码:

    #include <iostream>
    #include <cstdio>
    #include <math.h>
    #include <string.h>
    #include <sstream>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <set>
    #include <stack>
    using namespace std;
    int average(int a,int b,int c){
        int ave=0;
        ave = (a+b+c) / 3;
        return ave;
    }
    
    struct students{
        int id;
        int score[4];
        int rank[4];
        int min;
    };
    students stu[2000];
    int flag=-1;
    bool compare(students a,students b)
    {
        return a.score[flag]>b.score[flag];
    }
    int main() {
        int n,m;
        scanf("%d %d",&n,&m);
    
        for(int i=0;i<n;i++){
            scanf("%d %d %d %d",&stu[i].id,&stu[i].score[1],&stu[i].score[2],&stu[i].score[3]);
            stu[i].score[0] = average(stu[i].score[1], stu[i].score[2], stu[i].score[3]);
        }
     
        //找到从大到小排序后,原序列的index
        
    //    int rankindex=0;
        
        for(flag = 0; flag <= 3; flag++) {
            sort(stu, stu + n, compare);
            stu[0].rank[flag] = 1;
            for(int i = 1; i < n; i++) {
                stu[i].rank[flag] = i + 1;//标rank
                if(stu[i].score[flag] == stu[i-1].score[flag])//相等时取一样
                    stu[i].rank[flag] = stu[i-1].rank[flag];
            }
        }
    
        //找出每个学生排名最小的index
        int min;
        int existid[1000000] = {0};
        for(int i=0;i<n;i++){
            min=9999;
            existid[stu[i].id] = i+1;
            for(int j=0;j<4;j++){
                if(stu[i].rank[j]<min){
                    min=stu[i].rank[j];
                    stu[i].min=min;
                }
            }
        }
        
        //输出结果
        char subjects[5] = {'A', 'C', 'M', 'E'};
        int index;
        int id;
        for(int i=0;i<m;i++){
            scanf("%d",&id);
            int temp = existid[id];
            if(temp){
                for(int j=0;j<4;j++){
                    if(stu[temp-1].min == stu[temp-1].rank[j]){
                        index = j;
                        break;
                    }
                }
    //            printf("index: %d\n",index);
    //            index = stu[temp-1].min;
                printf("%d %c\n", stu[temp-1].min, subjects[index]);
            }
            else{
                cout<<"N/A"<<endl;
            }
        }
        
        return 0;
        
    }
    
    知识点+坑:
    1. struct 结构体的运用
      挺好用的,就像js里的object一样。

    2. sort() 函数

    sort函数有三个参数:
    (1)第一个是要排序的数组的起始地址。
    (2)第二个是结束的地址(最后一位要排序的地址)
    (3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

    sort函数使用模板:
    sort(start, end,排序方法)

    如果要从大到小排序,第三个函数可以这么写:

    bool compare(int a, int b)
    {
        return a>b;
    }
    

    写在sort里面时,就不需要对complare函数传入参数了,这是规则。
    点击查看原帖

    相关文章

      网友评论

          本文标题:1012 The Best Rank

          本文链接:https://www.haomeiwen.com/subject/zbyuvhtx.html