PAT 1153 Decode Registration Card of PAT

给出n个准考证号和成绩:
准考证号:
第1位:考试等级
第2-4位:考场号,范围:101-999
第5-10位:日期,格式:yymmdd
第11-13位:个人编号,范围:000-999
给m个查询:
三种类型:
1:给出考试等级,得到这个考试等级的所有考生的成绩,按成绩从大到小排序输出,如果成绩相同,显示出准考证号小的。
2:给出考场号,求出该考场的人数和所有人的成绩总和
3:给出考试日期,求该日期的考场和考场人数,按人数从大到小的输出,人数相同,考场号小的先输出。
这一题主要是对字符串的处理,将它转变成数字,然后对其按排序。然后按照日期和考场,统计人数,然后按照人数和考场排序。
这一题写了好久才写出来,提交上去,第五个测试点一直是错误,以为是哪种情况没想到,看了一下别人的源码还是没看出来哪种情况。最后自己测试了一下,发现第三种情况有错误,判断没有的条件写在了循环里。改过来之后就成功通过了。
这一题看了别人的代码,才发现我写的很麻烦,短时间内可能是写不出来的。(用时:4:30:22.71)。

#include <bits/stdc++.h>
using namespace std;
struct Card {
    int sit = 0;
    int date=0;
    int score=0;
    char cardNum[14];
};
struct Number {
    int Num;
    int date;
    int numCount = 0;

};

int GetCard(struct Card cards[],char cardnum[],int index )
{

    strcpy(cards[index].cardNum, cardnum);
    int i;
    for( i=1; i<4; i++) {
        cards[index].sit = cardnum[i]- '0' + cards[index].sit * 10;
    }

    for(; i<10; i++) {
        cards[index].date = cardnum[i] - '0' + cards[index].date * 10;
    }

    int num = 0;
    for(i=1; i<10; i++) {
        num  = cardnum[i] - '0' + num * 10;
    }

    return num;
}
bool cmp1(struct Card c1,struct Card c2)
{
    if(c1.score > c2.score  ) {
        return true;
    } else if(c1.score == c2.score) {
        return strcmp(c1.cardNum,c2.cardNum) < 0;
    }
    return false;
}
bool cmp2(struct Number num1,struct Number num2)
{
    if(num1.numCount > num2.numCount ) {
        return true;
    } else if(num1.numCount == num2.numCount) {
        return num1.Num < num2.Num;
    }

    return false;
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    char queryStr[14];
    int score = 0;
    Card card[n];
    Number number[n];
    int num = 0;
    map<int,int> keyMap;
    int length = 0;
    for(int i=0; i<n; i++) {
         scanf("%s%d",queryStr,&score);
         num = GetCard(card,queryStr,i);
         card[i].score = score;
        if(keyMap.count(num)==0) {
            number[length].date =  card[i].date;
            number[length].Num =  card[i].sit;
            keyMap[num] = length;
            number[length].numCount =  1;
            length++;
        } else {
            number[keyMap[num]].numCount++;
        }
    }
    sort(card,card+n,cmp1);
    sort(number,number+length,cmp2);
    int type;
    int dateNum = 0;
    int personCount = 0;
    int sitNum = 0;

    bool flag = true;
    for(int j=0; j<m; j++) {
        scanf("%d%s",&type,queryStr);
        flag = false;

        printf("Case %d: %d %s\n",j+1, type,  queryStr);
        switch(type) {
        case 1:
            for(int i=0; i<n; i++) {
                if(card[i].cardNum[0] ==  queryStr[0]) {
                    printf("%s %d\n",card[i].cardNum,card[i].score);
                    flag = true;
                }
            }
            if(!flag) {
                printf("NA\n");
            }
            break;
        case 2:
            sitNum = atoi(queryStr);
            personCount = 0;
            score = 0;
            for(int i=0; i<n; i++) {
                if(card[i].sit == sitNum) {
                    score += card[i].score;
                    personCount++;
                }
            }
            if(personCount > 0) {
                printf("%d %d\n",personCount,score);
            } else {
                printf("NA\n");
            }
            break;
        case 3:
            dateNum = atoi( queryStr);
            for(int i=0; i<length; i++) {
                if(number[i].date ==dateNum ) {
                    printf("%d %d\n",number[i].Num,number[i].numCount);
                    flag = true;
                }
            }
            if(!flag) {
                    printf("NA\n");
                }
            break;
        default:
            printf("NA\n");
            break;
        }

    }


    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值