A1153

题意:

输入准考证号,考试分数。然后输入查询命令,对每个命令按照要求模拟输出。

思路分析:

  • 命令为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;
}

猜你喜欢

转载自www.cnblogs.com/Western-Trail/p/10350460.html