题意:
输入准考证号,考试分数。然后输入查询命令,对每个命令按照要求模拟输出。
思路分析:
- 命令为
1 _
:表示查询考_级的所有记录,按照成绩从大到小排名,成绩相同则按照准考证号的字典序从小到大排序。于是得到第一个sost的cmp
函数为:
bool cmp(const record &a,const record &b) {
if(a.grade != b.grade) return a.grade > b.grade;
else return a.s < b.s;
}
- 命令为
2 _
:表示查询在_site考场的所有人的成绩之和。 - 命令为
3 _
:查询对应准考证的日期为_的记录,并获得各个考场的人数,同样按照cmp
的规则进行排序。
使用s.substr(i,k)
截取准考证号指定下标i开始,k个字符长度的字符串与输入的Term
做比较。
这道题比较坑的地方就是最后2个测试点超时的优化问题,一定要做到以下几点:
- 能用printf,scanf的地方绝对不能用cout和cin。否则一定超时
-
map<string,int>
,最好改成用unordered_map
这样更快
注意这两点就能完全AC了!
参考代码:
//1 A:考A级考试的所有记录,成绩从大到小排名,成绩相同,按照ID字典序
//2 107 在107号考场的所有人的成绩之和,
//3 180908 在18年09月8日考试的各个考场的人数,人数递减排序
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
struct record{
string s;
int grade;
}rec[maxn];
int n,m,Type;
string Term;
bool cmp(const record &a,const record &b) {
if(a.grade != b.grade) return a.grade > b.grade;
else return a.s < b.s;
}
int main(void){
cin>>n>>m;
for(int i = 0;i < n;i++) {
cin>>rec[i].s;
scanf("%d",&rec[i].grade);
}
for(int i = 0;i < m;i++) {
cin>>Type>>Term;
printf("Case %d: ",i+1);
cout<<Type<<" "<<Term<<endl;
switch(Type){
case 1:{
vector<record> ve;
for(int i = 0;i < n;i++) {
if(rec[i].s[0] == Term[0]) ve.push_back(rec[i]);
}
if(ve.size() == 0) printf("NA\n");
else {
sort(ve.begin(),ve.end(),cmp);
for(int i = 0;i < ve.size();i++) {
cout<<ve[i].s<<" ";
printf("%d\n",ve[i].grade);
}
}
break;
}
case 2:{
int total = 0,count = 0;
bool flag = false;
for(int i = 0;i < n;i++) {
string t = rec[i].s;
t = t.substr(1,3);
if(t == Term) {
flag = true;
count++;
total += rec[i].grade;
}
}
if(flag) printf("%d %d\n",count,total);
else printf("NA\n");
break;
}
case 3:{
vector<record> ve;
unordered_map<string,int> site;
for(int i = 0;i < n;i++) {
string t = rec[i].s;
t = t.substr(4,6);
if(t == Term) {
t = rec[i].s.substr(1,3);
site[t]++;
}
}
if(site.size() == 0) printf("NA\n");
else {
for(auto it:site) {
record temp{it.first,it.second};
ve.push_back(temp);
}
if(ve.size() == 0) printf("NA\n");
else {
sort(ve.begin(),ve.end(),cmp);
for(int i = 0;i < ve.size();i++)
{
cout<<ve[i].s<<" ";
printf("%d\n",ve[i].grade);
}
}
}
break;
}
}
}
return 0;
}