1153 Decode Registration Card of PAT

A registration card number of PAT consists of 4 parts:

  • the 1st letter represents the test level, namely, T for the top level, A for advance and B for basic;
  • the 2nd - 4th digits are the test site number, ranged from 101 to 999;
  • the 5th - 10th digits give the test date, in the form of yymmdd;
  • finally the 11th - 13th digits are the testee’s number, ranged from 000 to 999.

Now given a set of registration card numbers and the scores of the card owners, you are supposed to output the various statistics according to the given queries.

Input Specification

Each input file contains one test case. For each case, the first line gives two positive integers N (≤10
​4
​​ ) and M (≤100), the numbers of cards and the queries, respectively.

Then N lines follow, each gives a card number and the owner’s score (integer in [0,100]), separated by a space.

After the info of testees, there are M lines, each gives a query in the format Type Term, where

  • Type being 1 means to output all the testees on a given level, in non-increasing order of their scores. The corresponding Term will be the letter which specifies the level;
  • Type being 2 means to output the total number of testees together with their total scores in a given site. The corresponding Term will then be the site number;
  • Type being 3 means to output the total number of testees of every site for a given test date. The corresponding Term will then be the date, given in the same format as in the registration card.

Output Specification:

For each query, first print in a line Case #: input, where # is the index of the query case, starting from 1; and input is a copy of the corresponding input query. Then output as requested:

  • for a type 1 query, the output format is the same as in input, that is, CardNumber Score. If there is a tie of the scores, output in increasing alphabetical order of their card numbers (uniqueness of the card numbers is guaranteed);
  • for a type 2 query, output in the format Nt Ns where Nt is the total number of testees and Ns is their total score;
  • for a type 3 query, output in the format Site Nt where Site is the site number and Nt is the total number of testees at Site. The output must be in non-increasing order of Nt’s, or in increasing order of site numbers if there is a tie of Nt

If the result of a query is empty, simply print NA.

Sample Input

8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999

Sample Output

Case 1: 1 A
A107180908108 100
A107180908021 98
A112180318002 98
Case 2: 2 107
3 260
Case 3: 3 180908
107 2
123 2
102 1
Case 4: 2 999
NA

思路

这道题目考察std标准容器的使用,对于第一条需求,可以构造3个vector数组(vector <vector<pair<string, int >>)用于存储每个级别对应的考试号和分数,对于第二条需求可以通过维护一个map(map<int, pair<int,int>> site)在每次输入一个数据之后就对该字典进行更新,对于第三个需求可以同样维护一个字典(map<string, map<int, int>> 来实现,通过每次输入数据,然后解析出对应的日期和场次,之后更新人数,在需要进行查询的时候将第二个map中的数据导入到一个vector数组中,之后对数组进行排序,就可以得到所得的结果。
代码如下:

#include <algorithm>
#include <map>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
typedef pair<string, int> PAIR_Name;//为接下来的要使用到的pair 定义别名
typedef pair<int, int> PAIR_INT;
// 这两个比较函数都是用于对需要的vector数组进行排序的时候使用的
bool cmpbyvalue(PAIR_INT a, PAIR_INT b) {
	if (a.second != b.second) return a.second > b.second;
	else return a.first < b.first;
}
bool cmpscore(PAIR_Name a, PAIR_Name b) {
	if (a.second != b.second) return  a.second > b.second;
	else return a.first < b.first;
}
vector <vector<PAIR_Name>> namelist; // 用于满足第一个需求而,pair 中存放的是每个id对应的分数
map<int, PAIR_INT> site; // 用于满足第二个需求,每次输入数据更新pair中的值
map<string, map<int, int>> date_dict; //用于满足第三个需求的二维map,使用时需要将第二个map导入到一个vector 数组中
int main() {
	int n, m;
	cin >> n >> m;
	string id;
	int score;
	namelist.resize(200); // 这里设置为200是为了方便直接使用namelist['A']这种形式
	for (int i = 0; i < n; i++) {
		cin >> id >> score;
		char level = id[0];
		namelist[level].push_back(PAIR_Name(id, score));
		string site_name = id.substr(1, 3);
		int site_num = stoi(site_name);
		site[site_num].first++;
		site[site_num].second += score;
		string date = id.substr(4, 6);
		date_dict[date][site_num] += 1;

	}
	int k;
	for (int i = 0; i < m; i++) {
		cin >> k;
		if (k == 1) {
			char  test_level;
			cin >> test_level;
			sort(namelist[test_level].begin(), namelist[test_level].end(), cmpscore);
			printf("Case %d: %d %c\n", i + 1, k, test_level);
			if (namelist[test_level].size() == 0) cout << "NA" << endl;
			else {
				for (int j = 0; j < namelist[test_level].size(); j++) {
					cout << namelist[test_level][j].first << " " << namelist[test_level][j].second << endl;
				}
			}

		}
		else if (k == 2) {
			int site_num;
			cin >> site_num;
			printf("Case %d: %d %d\n", i + 1, k, site_num);
			if (site.find(site_num) != site.end())cout << site[site_num].first << " " << site[site_num].second << endl;
			else cout << "NA" << endl;
		}
		else {
			string date;
			cin >> date;
			printf("Case %d: %d ", i + 1, k);
			cout << date << endl;
			vector<pair<int, int>> date_map(date_dict[date].begin(), date_dict[date].end()); // 通过map来获得vector数组,用于接下来的排序
			if (date_map.size() == 0) {
				cout << "NA" << endl;
			}
			else {
				sort(date_map.begin(), date_map.end(), cmpbyvalue);
				for (int i = 0; i < date_map.size(); i++) {
					cout << date_map[i].first << " " << date_map[i].second << endl;
				}
			}
		}
	}

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值