1153 Decodificar tarjeta de registro de PAT (25 punto (s))

Ideas:

Para ideas no convencionales, primero diseñe la estructura de datos de modo que los registros se registren al ingresar y luego se clasifiquen o generen directamente al realizar consultas.

1153 Decodificar tarjeta de registro de PAT (25 punto (s))

Un número de tarjeta de registro de PAT consta de 4 partes:

  • la 1ª letra representa el nivel de prueba, es decir,  T para el nivel superior,  A para avanzado y  B para básico;
  • los dígitos 2º al 4º son el número del sitio de prueba, con un rango de 101 a 999;
  • los dígitos del quinto al décimo dan la fecha de la prueba, en forma de  yymmdd;
  • finalmente, los dígitos del 11 al 13 son el número del examinado, que van de 000 a 999.

Ahora, dado un conjunto de números de tarjeta de registro y las puntuaciones de los propietarios de la tarjeta, se supone que debe generar las diversas estadísticas de acuerdo con las consultas dadas.

Ejemplo:

#include<iostream>
#include<vector>
#include<cstring>
#include<map>
#include<set>
using namespace std;

int main()
{
    int N, M;
    cin >> N >> M;
    map<char, map<int, set<string>>> Type1;
    map<int, pair<int, int>> Type2;
    map<int, map<int, int>>  Type3;
    for(int i = 0; i < N; i++) {
        string id;
        int score;
        cin >> id >> score;
        Type1[id[0]][score].insert(id);
        int site = atoi(id.substr(1, 3).c_str());
        Type2[site].first++;
        Type2[site].second += score;
        int date = atoi(id.substr(4, 6).c_str());
        Type3[date][site]++;
    }
    for(int i = 1; i <= M; i++) {
        printf("Case %d: ", i);
        int type;
        cin >> type;
        if(type == 1) {
            char term;
            cin >> term;
            printf("%d %c\n", type, term);
            if(Type1.count(term) != 0) {
                for(auto x = Type1[term].rbegin(); x != Type1[term].rend(); x++) {
                    for(auto y : x->second) {
                        printf("%s %d\n", y.c_str(), x->first);
                    }
                }
                continue;
            }
        } else if(type == 2) {
            char temp[4];
            cin >> temp;
            printf("%d %s\n", type, temp);
            int term = atoi(temp);
            if(Type2.count(term) != 0) {
                printf("%d %d\n", Type2[term].first, Type2[term].second);
                continue;
            }
        } else if(type == 3) {
            char temp[8];
            cin >> temp;
            printf("%d %s\n", type, temp);
            int term = atoi(temp);
            if(Type3.count(term) != 0 && Type3[term].size() > 0) {
                map<int, set<int>> result;
                for(auto x: Type3[term]) {
                    result[x.second].insert(x.first);
                }
                for(auto x = result.rbegin(); x != result.rend(); x++) {
                    for(auto y : x->second) {
                        printf("%03d %d\n", y, x->first);
                    }
                }
                continue;
            }
        } else {
            char term[20];
            cin >> term;
            printf("%d %s\n", type, term);
        }
        cout << "NA\n";
    }
}

 

Supongo que te gusta

Origin blog.csdn.net/u012571715/article/details/114638382
Recomendado
Clasificación