【PTA】PAT (Nível Avançado) Prática 1004-1006

1004 Contando Folhas

Uma hierarquia familiar é geralmente apresentada por uma árvore genealógica. Seu trabalho é contar os membros da família que não têm filhos.

Especificação de entrada:
Cada arquivo de entrada contém um caso de teste. Cada caso começa com uma linha contendo 0<N<100, o número de nós em uma árvore e M (<N), o número de nós não-folha. Em seguida, M linhas seguem, cada uma no formato:

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

onde ID é um número de dois dígitos que representa um determinado nó não-folha, K é o número de seus filhos, seguido por uma sequência de IDs de dois dígitos de seus filhos. Para simplificar, vamos fixar o ID raiz em 01.

A entrada termina com N sendo 0. Esse caso NÃO deve ser processado.

Especificação de saída:
Para cada caso de teste, você deve contar os membros da família que não têm filhos para cada nível de senioridade, começando pela raiz. Os números devem ser impressos em linha, separados por um espaço, não devendo haver espaço extra ao final de cada linha.

O exemplo de caso representa uma árvore com apenas 2 nós, onde 01 é a raiz e 02 é seu único filho. Portanto, no nível raiz 01, há 0 nó folha; e no próximo nível, há 1 nó folha. Então devemos produzir 0 1 em uma linha.

Exemplo de entrada:

2 1
01 1 02

Saída de amostra:

0 1

Tradução:
Existe uma árvore genealógica com uma estrutura de árvore, e agora é preciso contar quantos nós de folha existem em cada camada .

Exemplo de entrada:
primeira linha: número de nós na árvore 0<N<100 número total de nós não-folha M (<N).
M linhas subseqüentes: o número de nós filhos do nó pai nó filho [1] nó filho [2]...

o código

A princípio, eu queria construir uma árvore binária de acordo com o pensamento inercial, mas depois de ler a pergunta com atenção, descobri que um nó pai pode ter vários nós filhos, então mudei de ideia.

A estrutura de construção corresponde a cada nó e contém informações sobre o nó pai, se existem filhos e em qual camada o nó atual está.

#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 Soletre Certo

Dado um inteiro não negativo N, sua tarefa é calcular a soma de todos os dígitos de N e produzir cada dígito da soma em inglês.

Especificação de entrada:
Cada arquivo de entrada contém um caso de teste. Cada caso ocupa uma linha que contém um N (≤10^100 ).

Especificação de saída:
Para cada caso de teste, imprima em uma linha os dígitos da soma em palavras em inglês. Deve haver um espaço entre duas palavras consecutivas, mas nenhum espaço extra no final de uma linha.

Exemplo de entrada:

12345

Saída de amostra:

um cinco

Tradução:
adicione uma string de números de entrada, um por um, e imprima o inglês correspondente aos números adicionados.

o código

O método de converter uma string a em um 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 Entrar e Sair

No início de cada dia, a primeira pessoa que assinar na sala do computador destrancará a porta e a última que sair trancará a porta. Dados os registros de entradas e saídas, você deve encontrar aqueles que abriram e trancaram a porta naquele dia.

Especificação de entrada:
Cada arquivo de entrada contém um caso de teste. Cada caso contém os registros de um dia. O caso começa com um inteiro positivo M, que é o número total de registros, seguido por M linhas, cada uma no formato:

ID_number Sign_in_time Sign_out_time

onde os horários são fornecidos no formato HH:MM:SS e ID_number é uma string com no máximo 15 caracteres.

Especificação de Saída:
Para cada caso de teste, imprima em uma linha os números de identificação das pessoas que destrancaram e trancaram a porta naquele dia. Os dois números de identificação devem ser separados por um espaço.

Nota: É garantido que os registros são consistentes. Ou seja, o horário de entrada deve ser anterior ao horário de saída de cada pessoa e não há duas pessoas entrando ou saindo ao mesmo tempo.

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

Saída de amostra:
SC3021234 CS301133

Tradução:
Todos os dias a primeira pessoa a chegar abre a porta, e a última pessoa a chegar tranca a porta. Descubra quem abriu e trancou a porta.

Entrada:
Há n alunos,
a hora em que o número de aluno de um aluno chega e a hora em que ele sai

o código

Dificuldade:
O código da linguagem C na Internet pode usar

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

É muito conveniente separar o ":" no tempo.
Mas C++ é entrada cin.
Mas depois de verificar as informações, descobri que

A string string adicionada por C++ é uma classe que sobrecarrega os operadores >, < e == e pode comparar diretamente o tamanho de duas strings.

#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;
}

FIM

おすすめ

転載: blog.csdn.net/qq_51669241/article/details/124898711