PAT_甲級_1153 Decode Registration Card of PAT

題目大意:

給出一組學生的准考證號和成績,准考證號包含了等級(乙甲頂),考場號,日期,和我的編號信息,並有三種查詢方式ios

  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進行排序輸出便可。

注意點:

  • 一、對於測試點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;
}
相關文章
相關標籤/搜索