题目链接:1055 集体照
思路
- 将输入进行排序,推荐从高到低排,我懒得改了。
- 再创建一个用于输出的数组,按照要求将排好序的数据逐行逐位填充即可。
- 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;
}