給出一組學生的准考證號和成績,准考證號包含了等級(乙甲頂),考場號,日期,和我的編號信息,並有三種查詢方式ios
首先咱們使用cards數組將全部的信息保存下來,也無需進行預處理(作預處理可能耗時更長),而後對於type的取值進行一一處理。算法
unordered_map<string,int> mymap
存儲當前term日期下的每個考場和人數的映射,而後遍歷cards集合,根據當前日期的考試信息統計每個考場 的人數,而後使用type3數組保存term日期下全部的考場編號和其考試人數,這裏複用了Card保存對應信息(類型都同樣,排序函數同樣),而後對於type3進行排序輸出便可。
#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; }