Questões de classificação de fotos em grupo PAT A1109

pergunta

1109 Foto de grupo (25 分)
A formação é muito importante ao tirar uma foto de grupo. Dadas as regras para formar K filas com N pessoas como segue:
O número de pessoas em cada fila deve ser N/K (arredondado para baixo para o inteiro mais próximo), com todas as pessoas extras (se houver) na última fila;
Todas as pessoas na fila de trás não devem ser mais baixas do que qualquer pessoa nas primeiras filas;
Em cada fileira, o mais alto fica na posição central (que é definida como a posição (m/2+1), onde m é o número total de pessoas naquela fileira, e o resultado da divisão deve ser arredondado para baixo para inteiro mais próximo);
Em cada fileira, outras pessoas devem entrar na fileira em ordem não crescente de altura, alternadamente posicionando-se primeiro à direita e depois à esquerda do mais alto (por exemplo, dadas cinco pessoas com altura 190, 188, 186, 175 e 170, a formação final seria 175, 188, 190, 186 e 170. Aqui assumimos que você está de frente para o grupo, então seu lado esquerdo é o lado direito daquele no centro posição.);
Quando houver muitas pessoas com a mesma altura, elas devem ser ordenadas em ordem alfabética (crescente) de seus nomes, sendo garantido que não haverá duplicidade de nomes.
Agora, com as informações de um grupo de pessoas, você deve escrever um programa para exibir sua formação.

Especificação de entrada:

Cada arquivo de entrada contém um caso de teste. Para cada caso de teste, a primeira linha contém dois inteiros positivos N (≤10
4
), o número total de pessoas e K (≤10), o número total de linhas. Então N linhas seguem, cada uma dando o nome de uma pessoa (não mais que 8 letras inglesas sem espaço) e sua altura (um inteiro em [30, 300]).

Especificação de saída:

Para cada caso, imprima a formação – ou seja, imprima os nomes das pessoas em K linhas. Os nomes devem ser separados por exatamente um espaço, mas não deve haver nenhum espaço extra ao final de cada linha. Observação: como você está de frente para o grupo, as pessoas nas fileiras de trás devem ser impressas acima das pessoas nas fileiras da frente.

Exemplo de entrada:

10 3
Tom 188
Mike 170
Eva 168
Tim 160
Joe 190
Ann 168
Bob 175
Nick 186
Amy 160
John 159
Nenhuma linha em branco no final
Exemplo de saída:

Bob Tom Joe Nick
Ann Mike Eva
Tim Amy John
sem linha em branco no final

linha de raciocínio

Primeiro, classifique por altura em ordem decrescente. Se a altura for a mesma, classifique em ordem lexicográfica ascendente por nome. Em seguida, encontre o padrão e descubra que as pessoas em cada linha estão divididas em duas partes. A que está à esquerda da pessoa mais alta é uma parte e a da direita é outra parte. , em seguida, imprima na ordem inversa à esquerda, depois imprima a primeira (a mais alta) e, finalmente, imprima na ordem positiva à direita.

o código

#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
struct node{
    
    
    char name[11];
    int height;
};
vector<node>people,leftPeople,rightPeople;
vector<node>ans[maxn];
int n,k,row;
bool cmp(node a,node b){
    
    
    if(a.height != b.height)
        return a.height > b.height;
    else
        return strcmp(a.name,b.name)<0;
}
int main() {
    
    
    cin>>n>>k;
    for (int i = 0; i < n; ++i) {
    
    
        node s;
        scanf("%s",s.name);
        scanf("%d",&s.height);
        people.push_back(s);
    }
    sort(people.begin(),people.end(),cmp);
    int row_count = n/k;  //每一行的人数
    int last_row_count,temp = 0;   //最后一行的人数
    if(row_count*k == n)last_row_count = row_count;
    else last_row_count = n-(row_count*(k-1));
    for (int i = 0; i < people.size(); ++i) {
    
    
        if(i<last_row_count){
    
    
            ans[k].push_back(people[i]);
        }else{
    
    
            temp++;
            row = k - (temp-1)/row_count - 1;
            ans[row].push_back(people[i]);
        }
    }
    for (int i = k; i > 0; --i) {
    
    
        leftPeople.clear();
        rightPeople.clear();
        for (int j = 1;j<ans[i].size();++j) {
    
    
            if(j % 2 != 0){
    
    
                leftPeople.push_back(ans[i][j]);
            }else{
    
    
                rightPeople.push_back(ans[i][j]);
            }
        }
        for (int j = leftPeople.size()-1; j >= 0; --j) {
    
    
            cout<<leftPeople[j].name<<" ";
        }
        cout<<ans[i][0].name;
        if(n != 1 && n != 2){
    
    
            cout<<" ";
        }
        for (int j = 0; j < rightPeople.size(); ++j) {
    
    
            cout<<rightPeople[j].name;
            if(j<rightPeople.size()-1)cout<<" ";
        }
        cout<<endl;
    }
    return 0;
}

Resumir

Arrays do tipo char[] não devem usar <> diretamente ao compará-los na função sort, caso contrário, ocorrerá um erro de segmento e strcmp()<>0 deve ser usado. Eu sou o dono do cartão aqui há muito tempo.

おすすめ

転載: blog.csdn.net/qq_19272233/article/details/119984059