【PAT乙级】1055 集体照

题目链接:1055 集体照

思路

  1. 将输入进行排序,推荐从高到低排,我懒得改了。
  2. 再创建一个用于输出的数组,按照要求将排好序的数据逐行逐位填充即可。
  3. 25分的题一次AC还是蛮开心的。

代码

#include <iostream>
#include <algorithm>
using namespace std;

struct person{
    string name;
    int tall;
};

int cmp(person p1,person p2){//按照身高由低向高排序
    if(p1.tall == p2.tall){
        for(int i=0;i<p1.name.length();i++){
            if(i==p2.name.length())return 1;
            if(p1.name[i]>p2.name[i])return 1;
            if(p1.name[i]<p2.name[i])return 0;
        }
        return 0;
    }
    return p1.tall < p2.tall;
}

int main(){
    int N,K,m,mid,count;
    cin >> N >> K;
    m = N / K + N % K;//最后一排人数
    count = N;
    person p[N],po[K][m];//分别存储输入与输出
    for(int i=0;i<N;i++) cin >> p[i].name >> p[i].tall;
    sort(p,p+N,cmp);
    for(int i=K-1;i>=0;i--){//第K行开始填充po
        mid = m / 2;//数组从0开始,故-1
        for(int j=0;j<m;j++){
            int bia = j % 2 ? -(j+1)/2 : (j+1)/2;//每轮填充相对中间的偏移
            po[i][mid+bia] = p[--count];
        }
        if(i == K-1) m -= N % K;//过了最后一行,修改每行人数
    }
    m = N / K + N % K;
    for(int i=K-1;i>=0;i--){
        for(int j=0;j<m;j++){
            cout << po[i][j].name;
            if(j != m-1) cout << ' ';
        }
        cout << endl;
        if(i == K-1) m -= N % K;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wulingyu501/article/details/108950002