PAT Advanced Level Practise 1012坑点

8 篇文章 0 订阅
7 篇文章 0 订阅

测试点2通不过,虽然只是占2/25的分,但是没AC很不爽,后来发现代码没有对分数相同的排名相同处理,题目没说,但感觉自己编程时应该要想到,还好只用2分。

不处理和处理对下面这个测试数据的结果不一样:

5 5
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 80 80 82
310105 82 82 83
310101
310102
310103
310104
310105

不处理

1 A
1 M
1 E
4 C
3 C

处理

1 A
1 M
1 E
4 C
2 C
/*
AC
2018/2/8
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

struct stu{
    long id;
    int c,m,e,a;
    int rank[4];
};

int cmpC(stu a,stu b){
    return a.c>b.c;
}

int cmpM(stu a,stu b){
    return a.m>b.m;
}

int cmpE(stu a,stu b){
    return a.e>b.e;
}

int cmpA(stu a,stu b){
    return a.a>b.a;
}

int main(){
    //freopen("1012input.txt","r",stdin);
    int n,m;
    cin>>n>>m;
    stu stuary[n];
    for(int i=0;i<n;i++){
        scanf("%ld %d %d %d",&stuary[i].id,&stuary[i].c,&stuary[i].m,&stuary[i].e);
        stuary[i].a=(stuary[i].c+stuary[i].m+stuary[i].e)/3;
    }
    sort(stuary,stuary+n,cmpC);
    stuary[0].rank[1]=1;
    for(int i=1;i<n;i++){
        stuary[i].rank[1]=i+1;
        if(stuary[i-1].c==stuary[i].c){
            stuary[i].rank[1]=stuary[i-1].rank[1];
        }
    }
    sort(stuary,stuary+n,cmpM);
    stuary[0].rank[2]=1;
    for(int i=1;i<n;i++){
        stuary[i].rank[2]=i+1;
        if(stuary[i-1].m==stuary[i].m){
            stuary[i].rank[2]=stuary[i-1].rank[2];
        }
    }
    sort(stuary,stuary+n,cmpE);
    stuary[0].rank[3]=1;
    for(int i=1;i<n;i++){
        stuary[i].rank[3]=i+1;
        if(stuary[i-1].e==stuary[i].e){
            stuary[i].rank[3]=stuary[i-1].rank[3];
        }
    }
    sort(stuary,stuary+n,cmpA);
    stuary[0].rank[0]=1;
    for(int i=0;i<n;i++){
        stuary[i].rank[0]=i+1;
        if(stuary[i-1].a==stuary[i].a){
            stuary[i].rank[0]=stuary[i-1].rank[0];
        }
    }
    long ID;
    bool isExit;
    int index;
    int minRank,minRankIndex;
    while(m--){
        scanf("%ld",&ID);
        isExit=false;
        for(int i=0;i<n;i++){
            if(stuary[i].id==ID){
                isExit=true;
                index=i;
                break;
            }
        }
        if(!isExit){
            printf("N/A\n");
            continue;
        }

        minRank=20000;
        for(int i=0;i<4;i++){
            if(stuary[index].rank[i]<minRank){
                minRankIndex=i;
                minRank=stuary[index].rank[i];
            }
        }
        printf("%d ",minRank);
        switch(minRankIndex){
            case 0:
            printf("A\n");
            break;
            case 1:
            printf("C\n");
            break;
            case 2:
            printf("M\n");
            break;
            case 3:
            printf("E\n");
            break;
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值