A1153.Decode Registration Card of PAT

题意:

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

思路分析:

  • 命令为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;
}
posted @ 2019-02-03 15:33  Western_Trail  阅读(319)  评论(0编辑  收藏  举报