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 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 (≤) and M (≤), the numbers of cards and the queries, respectively.

Then N lines follow, each gives a card number and the owner‘s score (integer in [), 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类型1和2都好处理,就是3需要map,直接记录考场号和日期拼接字符串对应考生的个数,然后排序。代码:
#include <iostream>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#define MAX 10001
using namespace std;
int n,m;
struct stu {
    char Tid[14];
    int score;
}s[MAX];
char *Substr(char *a,int l,int r) {
    char *t = (char *)malloc(sizeof(char) * (r - l + 1));
    for(int i = l;i < r;i ++) {
        t[i - l] = a[i];
    }
    t[r - l] = 0;
    return t;
}
int snum[1000],sscore[1000];///考场对应考生人数  和 总分的数组
int lnum[3];
char *str[MAX];///记录考场和日期总串
int c;
map<string,int> mp;
bool cmp(const stu &a,const stu &b) {
    if(a.Tid[0] == b.Tid[0]) {
        if(a.score == b.score) return strcmp(a.Tid,b.Tid) < 0;
        return a.score > b.score;
    }
    return a.Tid[0] < b.Tid[0];
}
bool cmp1(const char *a,const char *b) {
    if(mp[a] == mp[b]) return strcmp(a,b) < 0;
    return mp[a] > mp[b];
}
int main() {
    char *t;
    scanf("%d%d",&n,&m);
    for(int i = 0;i < n;i ++) {
        scanf("%s %d",s[i].Tid,&s[i].score);
        t = Substr(s[i].Tid,1,4);
        int d = atoi(t);
        snum[d] ++;
        sscore[d] += s[i].score;
        int dd = s[i].Tid[0] == ‘T‘ ? 2 : s[i].Tid[0] - ‘A‘;
        lnum[dd] ++;
        t = Substr(s[i].Tid,1,10);
        if(!mp[t]) {
            str[c] = (char *)malloc(sizeof(char) * 10);
            strcpy(str[c],t);
            c ++;
        }
        mp[t] ++;
    }
    sort(s,s + n,cmp);
    sort(str,str + c,cmp1);
    int choice,site;
    char level[2],date[7];
    for(int i = 1;i <= m;i ++) {
        scanf("%d",&choice);
        printf("Case %d: %d ",i,choice);
        if(choice == 1) {
            scanf("%s",level);
            printf("%s\n",level);
            int l,r;
            if(level[0] == ‘A‘) l = 0,r = lnum[0];
            else if(level[0] == ‘B‘) l = lnum[0],r = lnum[1];
            else l = lnum[0] + lnum[1],r = lnum[2];
            if(r == 0) {
                printf("NA\n");
                continue;
            }
            for(int j = 0;j < r;j ++) {
                printf("%s %d\n",s[l + j].Tid,s[l + j].score);
            }
        }
        else if(choice == 2) {
            scanf("%d",&site);
            printf("%d\n",site);
            if(!snum[site]) {
                printf("NA\n");
            }
            else {
                printf("%d %d\n",snum[site],sscore[site]);
            }
        }
        else {
            scanf("%s",&date);
            printf("%s\n",date);
            int d = 0;
            for(int j = 0;j < c;j ++) {
                if(strcmp(Substr(str[j],3,9),date) == 0) {
                    printf("%s %d\n",Substr(str[j],0,3),mp[str[j]]);
                    d ++;
                }
            }
            if(d == 0) printf("NA\n");
        }
    }
}

原文地址:https://www.cnblogs.com/8023spz/p/10211512.html

时间: 2024-07-30 15:29:35

1153 Decode Registration Card of PAT (25 分)的相关文章

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

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 注意!!不需要提前把所有都提取出来,变成

PTA乙级 (*1040 有几个PAT (25分))

1040 有几个PAT (25分) https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616 #include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> typedef lo

1040 有几个PAT (25分)

25分题中不是很难的一道,没错我就是挑软柿子捏,今天一定要把basic搞完,阿弥陀佛别拖拉了... 第一次提交后三个测试点运行超时(循环过多吧)....一开始是每遇到一个A就从前往后循环看这个A前面有多少P,有多少T. 第二次提交后后两个测试点答案错误,但是不超时了!微笑 - 由于结果可能比较大,只输出对 1000000007取余数的结果.(题目中的说明) 不要忽略这一句,这说明了个数有可能很大,所以将sum改为longlong型后面两个测试点就过了!! 呵呵.... 算法思想就是记录每一个A前

1025 PAT Ranking (25 分)

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

PTA 10-排序5 PAT Judge (25分)

题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/677 5-15 PAT Judge   (25分) The ranklist of PAT is generated from the status list, which shows the scores of the submissions. This time you are supposed to generate the ranklist for PAT. Input Spe

PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)

1040 Longest Symmetric String (25 分) Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?, the longest symmetric sub-string is s PAT&TAP s, hence you must output 11. In