• PAT乙级1095


    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




    第一次写的代码超时了,拿了19分

    #include <iostream>
    #include <vector>
    using namespace std;
    struct node
    {
        string id;
        string grade;
        string kaoc;
        string riqi;
        string kaos;
        int score;
    };
    struct node1
    {
        string kaoc;
        int ren=0;
    };
    bool cmp1(node a1,node a2)
    {
        if(a1.score!=a2.score)
        return a1.score>a2.score;
        if(a1.id!=a2.id)
            return a1.id<a2.id;
    }
    bool cmp2(node1 a1,node1 a2)
    {
        if(a1.ren!=a2.ren)
            return a1.ren>a2.ren;
        if(a1.kaoc!=a2.kaoc)
            return a1.kaoc<a2.kaoc;
    }
    int main()
    {
        int n,m;
        cin>>n>>m;
        string a;
        int score;
        vector<node> a1;
        node t;
        for (int i = 0; i < n; ++i) {
            cin>>a>>score;
            t.id=a;
            t.grade=a[0];
            string k;
            for(int i=1;i<4;i++)
                k+=a[i];
            t.kaoc=k;
            k="";
            for(int i=4;i<10;i++)
                k+=a[i];
            t.riqi=k;
            k="";
            for(int i=10;i<13;i++)
                k+=a[i];
            t.kaos=k;
            t.score=score;
            a1.push_back(t);
        }
        int k;
        string k1;
        for(int i=0;i<m;i++) {
            cin >> k >> k1;
            cout << "Case " << i + 1 << ": " << k << " " <<k1<<endl;
            vector<node> b;
            if (k == 1) {
                for (int j = 0; j < a1.size(); j++) {
                    if (a1[j].grade == k1)
                        b.push_back(a1[j]);
                }
                sort(b.begin(), b.end(), cmp1);
                if (b.size() == 0) {
                    cout << "NA";
                    if(i!=m-1)printf("
    ");
                    continue;
                }
                //cout << "Case " << i + 1 << ": " << k << " " <<k1<<endl;
                for (int j = 0; j < b.size(); j++) {
                     cout<<b[j].id<<" "<<b[j].score;
                     if(j!=b.size()-1)printf("
    ");
                }
            }
    
            if(k==2){
                int all=0,ren=0;
               for(int j=0;j<a1.size();j++){
                   if(k1==a1[j].kaoc)
                       {
                       all+=a1[j].score;
                       ren++;
                       }
               }
               if(ren==0){
                   cout<<"NA";
                   if(i!=m-1)printf("
    ");
                   continue;
               }
               //cout<<"Case "<<i+1<<": "<<k<<" "<<k1<<endl;
               cout<<ren<<" "<<all;
            }
    
            if(k==3)
            {
                vector<node1>tot;
                node1 r;
               for(int j=0;j<a1.size();j++) {
                   int flag = 0;
                   if (a1[j].riqi == k1) {
                       for (int l = 0; l < tot.size(); l++) {
                           if (tot[l].kaoc == a1[j].kaoc) {
                               tot[l].ren++;
                               flag = 1;
                               break;
                           }
                       }
                       if (!flag) {
                           r.kaoc = a1[j].kaoc;
                           r.ren = 1;
                           tot.push_back(r);
                       }
                   }
               }
                   if(tot.size()==0)
                   {
                       cout<<"NA";
                       if(i!=m-1)printf("
    ");
                       continue;
                   }
    
                sort(tot.begin(),tot.end(),cmp2);
               //cout<<"Case "<<i+1<<": "<<k<<" "<<k1<<endl;
               for(int k=0;k<tot.size();k++)
               {
                   cout<<tot[k].kaoc<<" "<<tot[k].ren;
                   if(k!=tot.size()-1)printf("
    ");
               }
            }
            if(i!=m-1)printf("
    ");
        }
        return 0;
    }
    修改后:
    #include <iostream>
    #include <vector>
    #include <unordered_map>
    using namespace std;
    struct node
    {
        string id;
        string grade;
        string kaoc;
        string riqi;
        string kaos;
        int score;
    };
    struct node1
    {
        string kaoc;
        int ren;
    };
    bool cmp1(node &a1,node &a2)
    {
        if(a1.score!=a2.score)
            return a1.score>a2.score;
        if(a1.id!=a2.id)
            return a1.id<a2.id;
    }
    bool cmp2(node1 &a1,node1 &a2)
    {
        if(a1.ren!=a2.ren)
            return a1.ren>a2.ren;
        if(a1.kaoc!=a2.kaoc)
            return a1.kaoc<a2.kaoc;
    }
    int main()
    {
        int n,m;
        cin>>n>>m;
        string a;
        int score;
        vector<node> a1;
        node t;
        for (int i = 0; i < n; ++i) {
            cin>>a>>score;
            t.id=a;
            t.grade=a[0];
            string k;
            for(int i=1;i<4;i++)
                k+=a[i];
            t.kaoc=k;
            k="";
            for(int i=4;i<10;i++)
                k+=a[i];
            t.riqi=k;
            k="";
            for(int i=10;i<13;i++)
                k+=a[i];
            t.kaos=k;
            t.score=score;
            a1.push_back(t);
        }
        int k;
        string k1;
        for(int i=0;i<m;i++) {
            cin >> k >> k1;
            cout << "Case " << i + 1 << ": " << k << " " <<k1<<endl;
            vector<node> b;
            if (k == 1) {
                for (int j = 0; j < a1.size(); j++) {
                    if (a1[j].grade == k1)
                        b.push_back(a1[j]);
                }
                sort(b.begin(), b.end(), cmp1);
                if (b.size() == 0) {
                    cout << "NA";
                    if(i!=m-1)printf("
    ");
                    continue;
                }
                //cout << "Case " << i + 1 << ": " << k << " " <<k1<<endl;
                for (int j = 0; j < b.size(); j++) {
                    cout<<b[j].id<<" "<<b[j].score;
                    if(j!=b.size()-1)printf("
    ");
                }
            }
    
            if(k==2){
                int all=0,ren=0;
                for(int j=0;j<a1.size();j++){
                    if(k1==a1[j].kaoc)
                    {
                        all+=a1[j].score;
                        ren++;
                    }
                }
                if(ren==0){
                    cout<<"NA";
                    if(i!=m-1)printf("
    ");
                    continue;
                }
                //cout<<"Case "<<i+1<<": "<<k<<" "<<k1<<endl;
                cout<<ren<<" "<<all;
            }
    
            if(k==3)
            {
                unordered_map<string,int>mp;
                vector<node1>tot;
                node1 r;
                for(int j=0;j<a1.size();j++) {
                    //int flag = 0;
                    if (a1[j].riqi == k1) {
                      mp[a1[j].kaoc]++;
                    }
                }
                if(mp.size()==0)
                {
                    cout<<"NA";
                    if(i!=m-1)printf("
    ");
                    continue;
                }
                unordered_map<string,int>::iterator it;
                 //for(it=mp.begin();it!=mp.end();it++)
                     //tot.push_back(node1{it->first,it->second});
                   //copy(mp.begin(),mp.end(),back_inserter(tot));
                   for(auto it:mp)
                       tot.push_back({it.first,it.second});
                sort(tot.begin(),tot.end(),cmp2);
                //cout<<"Case "<<i+1<<": "<<k<<" "<<k1<<endl;
                for(int k=0;k<tot.size();k++)
                {
                    cout<<tot[k].kaoc<<" "<<tot[k].ren;
                    if(k!=tot.size()-1)printf("
    ");
                }
                //cout<<tot.size();
            }
            if(i!=m-1)printf("
    ");
    
        }
        return 0;
    }

    主要修改的地方是:

    1.按日期查询每个考场人数时 用unordered_map存储,最后将unordered_map转化到vector进行排序汇总(而不是通过循环遍历)

    2.排序传参用引用传参,这样更快



  • 相关阅读:
    LeetCode 79. 单词搜索
    LeetCode 1143. 最长公共子序列
    LeetCode 55. 跳跃游戏
    LeetCode 48. 旋转图像
    LeetCode 93. 复原 IP 地址
    LeetCode 456. 132模式
    LeetCode 341. 扁平化嵌套列表迭代器
    LeetCode 73. 矩阵置零
    LeetCode 47. 全排列 II
    LeetCode 46. 全排列
  • 原文地址:https://www.cnblogs.com/zuiaimiusi/p/11384883.html
Copyright © 2020-2023  润新知