题目大意:
给出一组学生的准考证号和成绩,准考证号包含了等级(乙甲顶),考场号,日期,和个人编号信息,并有三种查询方式
- type1:给出考试等级,找出该等级的考生,按照成绩降序,准考证升序排序
- type2:给出考场号,统计该考场的考生数量和总得分
- type3:给出考试日期,查询该日期下所有考场的考试人数,按照人数降序,考场号升序排序
算法思路:
首先我们使用cards数组将所有的信息保存下来,也无需进行预处理(做预处理可能耗时更长),然后对于type的取值进行一一处理。
- type1:使用type1数组存储所有等级等于查询的term的信息,然后使用cmpByScore排序函数进行排序输出即可。
- type2:遍历cards集合,使用num和total统计与term考场编号相同的人数的总成绩,然后输出即可。
- type3:使用
unordered_map<string,int> mymap
存储当前term日期下的每一个考场和人数的映射,然后遍历cards集合,根据当前日期的考试信息统计每一个考场 的人数,然后使用type3数组保存term日期下所有的考场编号和其考试人数,这里复用了Card保存对应信息(类型都一样,排序函数一样),然后对于type3进行排序输出即可。
注意点:
- 1、对于测试点3超时的情况,首先对于type3得使用unordered_map存储映射关系,其次是如果使用了预处理的方式,不要在预处理的时候对于类型1和2都进行处理, 否则也会出现超时现象,因为会有大量无用的计算。
提交结果:
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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。