【PTA】PAT (Nivel Avanzado) Práctica 1004-1006

1004 contando hojas

Una jerarquía familiar generalmente se presenta mediante un árbol genealógico. Tu trabajo es contar a los miembros de la familia que no tienen hijos.

Especificación de entrada:
cada archivo de entrada contiene un caso de prueba. Cada caso comienza con una línea que contiene 0<N<100, el número de nodos en un árbol y M (<N), el número de nodos que no son hojas. Luego siguen M líneas, cada una en el formato:

ID K ID[1] ID[2] … ID[K]

donde ID es un número de dos dígitos que representa un nodo no hoja determinado, K es el número de sus hijos, seguido de una secuencia de ID de dos dígitos de sus hijos. En aras de la simplicidad, fijemos el ID de raíz para que sea 01.

La entrada termina con N siendo 0. Ese caso NO debe procesarse.

Especificación de salida:
para cada caso de prueba, se supone que debe contar los miembros de la familia que no tienen hijos para cada nivel de antigüedad a partir de la raíz. Los números deben estar impresos en una línea, separados por un espacio, y no debe haber espacio adicional al final de cada línea.

El caso de muestra representa un árbol con solo 2 nodos, donde 01 es la raíz y 02 es su único hijo. Por lo tanto, en el nivel raíz 01, hay 0 nodos hoja; y en el siguiente nivel, hay 1 nodo de hoja. Entonces deberíamos generar 0 1 en una línea.

Entrada de muestra:

2 1
01 1 02

Salida de muestra:

0 1

Traducción:
Hay un árbol genealógico con estructura de árbol, y ahora es necesario contar cuántos nodos hoja hay en cada capa .

Muestra de entrada:
primera línea: número de nodos en el árbol 0<N<100 número total de nodos que no son hojas M (<N).
Líneas M subsiguientes: el número de nodos secundarios del nodo principal nodo secundario [1] nodo secundario [2]...

el código

Al principio, quería construir un árbol binario de acuerdo con el pensamiento inercial, pero después de leer la pregunta detenidamente, descubrí que un nodo principal puede tener varios nodos secundarios, así que cambié de opinión.

La estructura de construcción corresponde a cada nodo y contiene información sobre el nodo padre, si hay hijos y en qué capa se encuentra el nodo actual.

#include<iostream>
using namespace std;
struct Node{
    
    
    int level;//当前节点在第几层
    int flag;//是否有孩子
    int father;//父节点
};
    int sum[105];
int main()
{
    
    
    struct Node nodes[105];
    int n,m;
    cin>>n>>m;
    int maxlevel=1;
    int nowNode, nowNodeNumber, childNode;
    int i,j;
    //初始化
    for(i=0;i<=n;i++){
    
    
        nodes[i].level=0;
        nodes[i].flag=0;
        nodes[i].father=0;
    }
    //这一句话很重要
    nodes[1].level=1;
    //输入
    while(m--){
    
    
        cin>>nowNode;
        cin>>nowNodeNumber;
        
        if(nowNodeNumber!=0)
            nodes[nowNode].flag=1;
        
        while(nowNodeNumber--){
    
    
            cin>>childNode;
            nodes[childNode].father=nowNode;
        }
    }
    //将每个节点在第几层给算出来
    for(i=1;i<=n;i++){
    
    
        for(j=1;j<=n;j++){
    
    
            //如果有一个点的父亲标识是自己,那么它就是你的儿子,那么他的等级,应该是你的等级+1
            if(nodes[j].father==i){
    
    
                nodes[j].level=nodes[i].level+1;
            }
        }
    }
    //查询每一层有多少个叶子节点,记录在sum数组里面
    for(i=1;i<=n;i++){
    
    
        if(nodes[i].flag!=1 && nodes[i].level>0){
    
    
            sum[nodes[i].level]++;
        }
        //记录最大的等级,用于最后的输出
        if(nodes[i].level>maxlevel){
    
    
            maxlevel=nodes[i].level;
        }
    }
    for(i=1;i<maxlevel;i++){
    
    
        cout<<sum[i]<<" ";
    }
    cout<<sum[i];
}

1005 Deletrearlo bien

Dado un número entero no negativo N, su tarea es calcular la suma de todos los dígitos de N y generar cada dígito de la suma en inglés.

Especificación de entrada:
cada archivo de entrada contiene un caso de prueba. Cada caso ocupa una línea que contiene una N (≤10^100).

Especificación de salida:
para cada caso de prueba, genere en una línea los dígitos de la suma en palabras en inglés. Debe haber un espacio entre dos palabras consecutivas, pero ningún espacio adicional al final de una línea.

Entrada de muestra:

12345

Salida de muestra:

Uno Cinco

Traducción:
agregue una cadena de números de entrada uno por uno y emita el inglés correspondiente al número agregado.

el código

El método para convertir una cadena a en un número:

a-'0'

#include<iostream>
using namespace std;
int main(){
    
    
    string a;
    cin>>a;
    int sum=0;
    for(int i=0;i<a.length();i++){
    
    
        sum+=(a[i]-'0');
    }
    string s=to_string(sum);
    string arr[10]={
    
    "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    cout<<arr[s[0]-'0'];
    for(int i=1;i<s.length();i++)
        cout<<" "<<arr[s[i]-'0'];
}

1006 Iniciar y cerrar sesión

Al comienzo de cada día, la primera persona que inicie sesión en la sala de informática desbloqueará la puerta y la última persona que inicie sesión cerrará la puerta. Teniendo en cuenta los registros de entrada y salida, se supone que debes encontrar a los que han abierto y cerrado la puerta ese día.

Especificación de entrada:
cada archivo de entrada contiene un caso de prueba. Cada caso contiene los registros de un día. El caso comienza con un entero positivo M, que es el número total de registros, seguido de M líneas, cada una con el formato:

ID_number Sign_in_time Sign_out_time

donde los tiempos se dan en el formato HH:MM:SS, y ID_number es una cadena con no más de 15 caracteres.

Especificación de salida:
para cada caso de prueba, envíe en una línea los números de identificación de las personas que han desbloqueado y bloqueado la puerta ese día. Los dos números de identificación deben estar separados por un espacio.

Nota: Se garantiza que los registros sean consistentes. Es decir, la hora de inicio de sesión debe ser anterior a la hora de salida de cada persona, y no hay dos personas que inicien sesión o salgan en el mismo momento.

Entrada de muestra:
3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40

Salida de muestra:
SC3021234 CS301133

Traducción:
Todos los días, la primera persona en llegar abre la puerta y la última persona en llegar cierra la puerta. Averigüe quién abrió y cerró la puerta.

Entrada:
hay n estudiantes,
la hora en que llega el número de estudiante de un estudiante y la hora en que se va

el código

Dificultad:
El código de lenguaje C en Internet puede usar

scanf(“%d:%d:%d %d:%d:%d”, &h1, &m1, &s1, &h2, &m2, &s2);

Es muy conveniente separar el ":" en el tiempo.
Pero C++ es entrada cin.
Pero después de verificar la información, descubrí que

La cadena cadena agregada por C++ es una clase que sobrecarga los operadores >, < y ==, y puede comparar directamente el tamaño de dos cadenas.

#include<iostream>
using namespace std;
struct Student{
    
    
    string id;
    string in;
    string out;
};
int main()
{
    
    
    int n;
    cin>>n;
    struct Student s[20];
    for(int i=0;i<n;i++){
    
    
        cin>>s[i].id>>s[i].in>>s[i].out;
    }
    string unlock,lock;
    string early="24:00:00",late="00:00:00";
    for(int i=0;i<n;i++){
    
    
        if(s[i].in<early){
    
    
            unlock=s[i].id;
            early=s[i].in;
        }
        if(s[i].out>late){
    
    
            lock=s[i].id; 
            late=s[i].out;
        }
    }
    cout<<unlock<<" "<<lock;
}

FIN

Supongo que te gusta

Origin blog.csdn.net/qq_51669241/article/details/124898711
Recomendado
Clasificación