1153.Decode Registration Card of PAT(unordered_map)

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
-----------------------

注意:使用unordered_map(头文件unordered_map)比map(头文件map)更高效,因为map内存在键值的自动排序;

cmp()函数传参比使用引用的形式效率会更高;

题目大意:

读入n个考生的考生号和分数,执行m个操作:

操作存在三种情况:

case1:输出所有对应级别考试的考生号和分数,按照分数降序,分数相同时考生号升序排列

case2:输出对应考点的考生人数和考场的总分数:

case3:输出对应考试时间的各个考点的考点号和考生数(使用unordered_map更高效,map)

#include<stdio.h>
#include<vector>
#include<iostream>
#include<string>
#include<algorithm>
#include<unordered_map>
#pragma warning(disable:4996)
using namespace std;
int n, m;
struct Node {
    string t;
    int score;
};
bool cmp(Node &a, Node&b){
    return a.score != b.score ? a.score>b.score : a.t<b.t;
}
int main()
{
    cin >> n >> m;
    vector<Node>v(n);
    for (int i = 0; i < n; i++) {
        cin >> v[i].t >> v[i].score;
    }
        for (int i = 1; i <= m; i++) {
        string s;
        int num;
        int tp = 0, tc = 0;
        cin >> num >> s;
        printf("Case %d: %d %s\n", i, num, s.c_str());
        vector<Node>ans;
        if (1 == num) {
            for (int j = 0; j < n; j++) {
                if (v[j].t[0] == s[0])ans.push_back(v[j]);
            }
        }
        else if (2 == num) {

            for (int j = 0; j < n; j++) {
                if (v[j].t.substr(1, 3) == s) {
                    tp++, tc += v[j].score;
                }
            }
            if (tp) {
                printf("%d %d\n", tp, tc);
            }

        }
        else if (3 == num) {
            unordered_map<string, int>ss;
            for (int j = 0; j < n; j++) {
                if (v[j].t.substr(4, 6) == s)ss[v[j].t.substr(1, 3)]++;
            }
            for (auto t : ss)ans.push_back({t.first,t.second});
        }

        if (((1 == num || 3 == num) && 0 == ans.size()) || (2 == num&&0 == tp)) {
            printf("NA\n");
            continue;
        }
        sort(ans.begin(), ans.end(), cmp);
        for (auto ss : ans) {
            printf("%s %d\n", ss.t.c_str(), ss.score);
        }
    }

    return 0;
}

原文地址:https://www.cnblogs.com/zxzmnh/p/11632644.html

时间: 2024-08-30 14:12:15

1153.Decode Registration Card of PAT(unordered_map)的相关文章

PAT Advanced 1153 Decode Registration Card of PAT (25 分)

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

1153 Decode Registration Card of PAT (25 分)

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

1153 Decode Registration Card of PAT

这道题一开始一直超时,后来看了大神的发现要用unordered_map,然后还是不行,把cout改成printf,居然过了...时间真的掐得紧 #include <iostream> #include <stdlib.h> #include <string> #include<algorithm> #include<vector> #include<cmath> #include<map> #include <uno

PAT A1153 Decode Registration Card of PAT [硬核模拟]

题目描述 链接 给出一组学生的准考证号和成绩,准考证号包含了等级(乙甲顶),考场号,日期,和个人编号信息,并有三种查询方式 查询一:给出考试等级,找出该等级的考生,按照成绩降序,准考证升序排序 查询二:给出考场号,统计该考场的考生数量和总得分 查询三:给出考试日期,查询改日期下所有考场的考试人数,按照人数降序,考场号升序排序 分析 查询一和查询二都是可以直接遍历做到的!!!直接遍历,不用存中间状态!!!否则用map超时 查询三用unordered_map 注意!!不需要提前把所有都提取出来,变成

PAT(甲级)2018年冬季考试

1152 Google Recruitment 思路:判断素数 #include<bits/stdc++.h> using namespace std; const int maxn = 1100; int a[maxn]; int n,k; long long getNum(int pos){ long long x = 0; for(int i=pos;i<=pos+k-1;i++){ x = x*10 + a[i]; } return x; } bool prime(long lo

A题目

1 1001 A+B Format(20) 2 1002 A+B for Polynomials(25) 3 1003 Emergency(25) 4 1004 Counting Leaves(30) 5 1005 Spell It Right(20) 6 1006 Sign In and Sign Out(25) 7 1007 Maximum Subsequence Sum(25) 8 1008 Elevator(20) 9 1009 Product of Polynomials(25) 10

[LeetCode] Encode and Decode TinyURL 编码和解码小URL地址

Note: This is a companion problem to the System Design problem: Design TinyURL. TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/design-tinyurl and it returns a short URL such as http://tinyurl.com/4e9iA

【译】基于主机的卡仿真(Host-based Card Emulation)

基于主机的卡仿真(Host-based Card Emulation) 能提供NFC功能很多Android手机已经支持NFC卡模拟.在大多数情况下,该卡是由设备中的单独的芯片仿真,所谓的安全元件.由无线运营商提供了许多的SIM卡还包含一个安全元件. 安卓4.4引入卡仿真的附加方法,该方法不涉及安全元件,称为基于主机的卡模拟.这允许任何Android应用程序来模拟卡,并直接与NFC读取器.本文档介绍了如何基于主机的卡仿真( HCE )适用于Android和如何使用这种技术开发的应用程序,模拟的NF

1025. PAT Ranking (25)

题目如下: Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhejiang University. Each test is supposed to run simultaneously in several places, and the ranklists will be merged immediately after the test. No