• PAT甲 1095 解码PAT准考证/1153 Decode Registration Card of PAT(优化技巧)


    1095 解码PAT准考证/1153 Decode Registration Card of PAT(25 分)

    PAT 准考证号由 4 部分组成:

    • 第 1 位是级别,即 T 代表顶级;A 代表甲级;B 代表乙级;
    • 第 2~4 位是考场编号,范围从 101 到 999;
    • 第 5~10 位是考试日期,格式为年、月、日顺次各占 2 位;
    • 最后 11~13 位是考生编号,范围从 000 到 999。

    现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各种统计信息。

    输入格式:

    输入首先在一行中给出两个正整数 N(104​​)和 M(100),分别为考生人数和统计要求的个数。

    接下来 N 行,每行给出一个考生的准考证号和其分数(在区间 [0,100] 内的整数),其间以空格分隔。

    考生信息之后,再给出 M 行,每行给出一个统计要求,格式为:类型 指令,其中

    • 类型 为 1 表示要求按分数非升序输出某个指定级别的考生的成绩,对应的 指令 则给出代表指定级别的字母;
    • 类型 为 2 表示要求将某指定考场的考生人数和总分统计输出,对应的 指令 则给出指定考场的编号;
    • 类型 为 3 表示要求将某指定日期的考生人数分考场统计输出,对应的 指令 则给出指定日期,格式与准考证上日期相同。

    输出格式:

    对每项统计要求,首先在一行中输出 Case #: 要求,其中 # 是该项要求的编号,从 1 开始;要求 即复制输入给出的要求。随后输出相应的统计结果:

    • 类型 为 1 的指令,输出格式与输入的考生信息格式相同,即 准考证号 成绩。对于分数并列的考生,按其准考证号的字典序递增输出(题目保证无重复准考证号);
    • 类型 为 2 的指令,按 人数 总分 的格式输出;
    • 类型 为 3 的指令,输出按人数非递增顺序,格式为 考场编号 总人数。若人数并列则按考场编号递增顺序输出。

    如果查询结果为空,则输出 NA

    输入样例:

    8 4
    B123180908127 99
    B102180908003 86
    A112180318002 98
    T107150310127 62
    A107180908108 100
    T123180908010 78
    B112160918035 88
    A107180908021 98
    1 A
    2 107
    3 180908
    2 999
    

    输出样例:

    Case 1: 1 A
    A107180908108 100
    A107180908021 98
    A112180318002 98
    Case 2: 2 107
    3 260
    Case 3: 3 180908
    107 2
    123 2
    102 1
    Case 4: 2 999
    NA


    ----------------------------------------------------------------------------------
    思路:题意很清晰,题解见代码。本题最后两个数据点有超时风险,AC需要以下几个优化小技巧。

    1.自定义排序引用传参较快
    2.string使用printf输出,string.c_str()
    3.使用unordered_map(key未排序)优于map,较低版本编译器可能会出现编译错误(c++11)
    ps:也可以使用数组变量记录,map虽然只会遍历大于0的key,但效率远不及数组变量


    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    struct Node{
        string num;
        int sco;
    }a[10005],b[10005];
    
    bool cmp(const Node &a,const Node &b){     //引用传参
        if(a.sco==b.sco) return a.num<b.num;
        return a.sco>b.sco;
    }
    int main()
    {
        int n,m,i,j;
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++){
            cin>>a[i].num>>a[i].sco;
        }
        int tt=0;
        int x;
        string y;
        while(m--){
            tt++;
            cin>>x>>y; 
            printf("Case %d: %d %s
    ",tt,x,y.c_str());   //printf输出string
            int c=0,ans=0;
            unordered_map<string,int> bb;    //c++11版,优于map
            for(i=1;i<=n;i++){
                if(x==1){
                    if(a[i].num[0]==y[0]){
                        c++;
                        b[c].num=a[i].num;
                        b[c].sco=a[i].sco;
                    }
                }
                else if(x==2){
                    if(a[i].num.substr(1,3)==y){
                        c++;
                        ans+=a[i].sco;
                    }
                }
                else{
                    if(a[i].num.substr(4,6)!=y) continue;
                    bb[a[i].num.substr(1,3)]++;
                }
            }
            if(x==1){
                if(c==0) printf("NA
    ");
                else{
                    sort(b+1,b+c+1,cmp);
                    for(i=1;i<=c;i++){
                        printf("%s %d
    ",b[i].num.c_str(),b[i].sco);   //
                    }
                }
            }
            else if(x==2){
                if(c==0) printf("NA
    ");
                else printf("%d %d
    ",c,ans);
            }
            else{
                unordered_map<string,int>::iterator it;
                for(it=bb.begin();it!=bb.end();it++){    //只遍历value不为0的key
                    c++;
                    b[c].num=it->first;
                    b[c].sco=it->second;
                }
                if(c==0) printf("NA
    ");
                else{
                    sort(b+1,b+c+1,cmp);
                    for(i=1;i<=c;i++){
                        printf("%s %d
    ",b[i].num.c_str(),b[i].sco);     //
                    }
                }
            }
        }
        return 0;
    }
     
  • 相关阅读:
    QNET弱网测试工具
    echart
    数组按照一大一小打乱排列
    根据环境开启 vconsole
    时间戳在ios上面显示NAN Bug
    去除字符串中html标签
    ios 上 复选框背景黑边bug
    echarts配置项说明
    JS 数据处理技巧及小算法
    js中最常用的几种遍历数据方法
  • 原文地址:https://www.cnblogs.com/yzm10/p/10458637.html
Copyright © 2020-2023  润新知