PTA甲級考試真題練習153——1153 Decode Registration Card of PAT

題目

在這裏插入圖片描述

思路

注意兩點:

  • 要用printf代替cout否則最後兩個測試點超時
  • 要三個查詢要分開存儲,不能存儲在一個大塊,活用unordered_map

代碼

#include <iostream>
#include <vector>
#include <unordered_map>
#include <string>
#include <algorithm>
#include <string.h>
using namespace std;
vector<pair<string, int>> tmp[3];
pair<int,int> mark[1000];
unordered_map<int,unordered_map<int,int>> mmm;
bool cmp(const pair<string, int>& a, const pair<string, int>& b) {
	return a.second != b.second ? a.second > b.second : a.first < b.first;
}
bool cmp1(const pair<int, int>& a, const pair<int, int>& b) {
	return a.second != b.second ? a.second > b.second : a.first < b.first;
}
int main()
{
	int n, qn;
	cin >> n >> qn;
	for (int i = 0; i < 1000; ++i) {
		mark[i].first = mark[i].second = 0;
	}
	for (int i = 0; i < n; ++i) {
		string ID;
		int score;
		cin >> ID >> score;
		int site = stoi(ID.substr(1, 3));
		int date = stoi(ID.substr(4, 6));
		if (ID[0] == 'A')
			tmp[0].emplace_back(pair<string, int>(ID, score));
		else if (ID[1] == 'B')
			tmp[1].emplace_back(pair<string, int>(ID, score));
		else
			tmp[2].emplace_back(pair<string, int>(ID, score));
		mark[site].first++;
		mark[site].second += score;
		auto p = mmm.find(date);
		if (mmm.count(date)) {
			if (p->second.count(site))
				p->second[site]++;
			else
				mmm[date].emplace(make_pair(site, 1));
		}
		else 
			mmm[date].emplace(make_pair(site, 1));
	}
	sort(tmp[0].begin(), tmp[0].end(), cmp);
	sort(tmp[1].begin(), tmp[1].end(), cmp);
	sort(tmp[2].begin(), tmp[2].end(), cmp);
	for (int i = 1; i <= qn; ++i) {
		int qnum;
		string qqs;
		cin >> qnum >> qqs;
		printf("Case %d: %d %s\n", i, qnum, qqs.c_str());
		if (qnum == 1) {
			char qq = qqs[0];
			int _index;
			if (qq == 'A')
				_index = 0;
			else if (qq == 'B')
				_index = 1;
			else
				_index = 2;
			if (tmp[_index].empty()) {
				printf("NA\n");
				continue;
			}
			for (auto& p : tmp[_index])
				printf("%s %d\n", p.first.c_str(), p.second);
		}
		else if (qnum == 2) {
			int qq = stoi(qqs);
			if (mark[qq].first == 0) {
				printf("NA\n");
				continue;
			}
			printf("%d %d\n", mark[qq].first, mark[qq].second);
		}
		else{
			int qq = stoi(qqs);
			auto p = mmm. find(qq);
			if (p == mmm.end()) {
				printf("NA\n");
				continue;
			}
			vector<pair<int, int>> tt(p->second.begin(),p->second.end());
			sort(tt.begin(), tt.end(), cmp1);
			for (auto& p : tt)
				printf("%d %d\n", p.first, p.second);
		}
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章