下面是我遇到的坑:
- 能用printf就不要用cout
- 不要用map用unordered_map
- 每个指令的空数据的情况都要考虑到并输出NA
- 使用swich case的格式的话记得在default情况输出NA
- 不能用char作为实参传递给string类型的形参
- sort函数不能对map进行排序
- 是先输入N再输入M,而不是按照字母表的顺序先输入M再输入N(反正我是在初始化vector的时候被坑了)
# include <iostream>
# include <vector>
# include <algorithm>
# include <unordered_map>
using namespace std;
// 这个比较函数可以满足指令1和3的排序规则
bool cmp(pair<string, int> & x, pair<string, int> & y)
{
return x.second != y.second ? x.second > y.second : x.first < y.first;
}
// 类型 为 1 的指令,输出格式与输入的考生信息格式相同,即 准考证号 成绩。
// 对于分数并列的考生,按其准考证号的字典序递增输出(题目保证无重复准考证号);
void showLevel(string level, vector<pair<string, int>> & infos)
{
vector<pair<string, int>> v;
for(auto i : infos)
if(i.first[0] == level[0])
v.push_back(i);
sort(v.begin(), v.end(), cmp);
// 空数据输出NA,非空则按格式输出
if(v.size() == 0)
printf("NA\n");
else
for(auto i : v)
printf("%s %d\n",i.first.c_str(), i.second);
}
// 类型 为 2 的指令,按 人数 总分 的格式输出
void showRoom(string room, vector<pair<string, int>> & infos)
{
int cnt = 0;
int sum = 0;
for(auto i : infos)
if(i.first.substr(1, 3) == room){
cnt++;
sum += i.second;
}
// 空数据输出NA,非空则按格式输出
if(cnt == 0)
printf("NA\n");
else
printf("%d %d\n", cnt, sum);
}
// 类型 为 3 的指令,输出按人数非递增顺序,格式为 考场编号 总人数。
// 若人数并列则按考场编号递增顺序输出。
void showDate(string date, vector<pair<string, int>> & infos)
{
unordered_map<string, int> m;
for(auto i : infos)
if(i.first.substr(4, 6) == date)
m[i.first.substr(1, 3)]++;
// 因为sort函数不能用于map,所以将其放入vector中进行排序
vector<pair<string, int>> v(m.begin(), m.end());
sort(v.begin(), v.end(), cmp);
// 空数据输出NA,非空则按格式输出
if(m.size() == 0)
printf("NA\n");
else
for(auto i : v)
printf("%s %d\n", i.first.c_str(), i.second);
}
int main(void)
{
int N, M;
cin >> N >> M;
// 输入
vector<pair<string, int>> infos(N); // 存放考生信息 infos[i].first是准考证号 infos[i].second是考生成绩
vector<pair<int, string>> comds(M); // 存放指令 comds[i].first是指令类型 comds[i].second是指令
for(int i=0;i<N;++i)
cin >> infos[i].first >> infos[i].second;
for(int i=0;i<M;++i)
cin >> comds[i].first >> comds[i].second;
// 遍历指令
for(int i=0;i<M;i++)
{
printf("Case %d: %d %s\n", i+1, comds[i].first, comds[i].second.c_str());
switch(comds[i].first)
{
case 1:
showLevel(comds[i].second, infos);
break;
case 2:
showRoom(comds[i].second, infos);
break;
case 3:
showDate(comds[i].second, infos);
break;
default:
printf("NA");
break;
}
}
return 0;
}