2

题目大意:

给出一组学生的准考证号和成绩,准考证号包含了等级(乙甲顶),考场号,日期,和个人编号信息,并有三种查询方式

  1. type1:给出考试等级,找出该等级的考生,按照成绩降序,准考证升序排序
  2. type2:给出考场号,统计该考场的考生数量和总得分
  3. type3:给出考试日期,查询该日期下所有考场的考试人数,按照人数降序,考场号升序排序

算法思路:

首先我们使用cards数组将所有的信息保存下来,也无需进行预处理(做预处理可能耗时更长),然后对于type的取值进行一一处理。

  1. type1:使用type1数组存储所有等级等于查询的term的信息,然后使用cmpByScore排序函数进行排序输出即可。
  2. type2:遍历cards集合,使用num和total统计与term考场编号相同的人数的总成绩,然后输出即可。
  3. type3:使用unordered_map<string,int> mymap存储当前term日期下的每一个考场和人数的映射,然后遍历cards集合,根据当前日期的考试信息统计每一个考场 的人数,然后使用type3数组保存term日期下所有的考场编号和其考试人数,这里复用了Card保存对应信息(类型都一样,排序函数一样),然后对于type3进行排序输出即可。

注意点:

  • 1、对于测试点3超时的情况,首先对于type3得使用unordered_map存储映射关系,其次是如果使用了预处理的方式,不要在预处理的时候对于类型1和2都进行处理, 否则也会出现超时现象,因为会有大量无用的计算。

提交结果:

image.png

AC代码:

#include<cstdio>
#include<vector>
#include<string>
#include<iostream>
#include<unordered_map>
#include<algorithm>

using namespace std;

struct Card{
    string id;
    int score;
};
vector<Card> cards;

bool cmpByScore(const Card& a,const Card& b){
    return a.score!=b.score?a.score>b.score:a.id<b.id;
}

int main(){
    int N,M;
    scanf("%d %d",&N,&M);
    Card card;
    for (int i = 0; i < N; ++i) {
        cin>>card.id>>card.score;
        cards.push_back(card);
    }
    int type;
    string term;
    for(int i=0;i<M;++i){
        cin>>type>>term;
        printf("Case %d: %d %s\n",i+1,type,term.c_str());
        if(type==1){
            // 按照分数逆序输出term level的所有card信息
            vector<Card> type1;
            for(auto &item:cards){
                if(item.id[0]==term[0]){
                    type1.push_back(item);
                }
            }
            if(type1.empty()){
                printf("NA\n");
                continue;
            }
            sort(type1.begin(),type1.end(),cmpByScore);
            for(auto &item:type1){
                printf("%s %d\n",item.id.c_str(),item.score);
            }
        } else if(type==2){
            // 输出所有term考场的总人数和总成绩
            int num = 0;
            int total = 0;
            for(auto &item:cards){
                if(item.id.substr(1,3)==term){
                    ++num;
                    total += item.score;
                }
            }
            if(num==0){
                printf("NA\n");
                continue;
            }
            printf("%d %d\n",num,total);
        } else if(type==3){
            // 输出term日期中每一个考场编号和其考试人数,根据考试人数逆序排列
            unordered_map<string,int> mymap;// 存储当前term日期下的每一个考场和人数的映射
            for(auto &item:cards){
                if(item.id.substr(4,6)==term){
                    ++mymap[item.id.substr(1,3)];
                }
            }
            if(mymap.empty()){
                printf("NA\n");
                continue;
            }
            // 保存term日期下所有的考场编号和其考试人数,这里复用了Card保存对应信息(类型都一样,排序函数一样)
            vector<Card> type3;
            for(auto & it : mymap){
                type3.push_back(Card{it.first,it.second});
            }
            sort(type3.begin(),type3.end(),cmpByScore);
            for(auto &item:type3){
                printf("%s %d\n",item.id.c_str(),item.score);
            }
        } else {
            printf("NA\n");
        }
    }
    return 0;
}


乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得