题意:给定一定人名字和高度,给他们拍照,拍照的要求是总共n个人,每排k个人,每排最多站n/k个人,其余站不下的人在较后面一排,每排排序的顺序是最高的站在中间,即m/2放最高人的名字,然后次高的站在左边,在次高的站在右边,即高的先站左边然后在站右边,每个依次进行,每排的高度都是大于前面一排人的高度的。
思路:用一个结构体数组保存每个人的信息,然后从高到低的顺序排序,设置每排人的数量,把最高的姓名放到m/2位置上,把0-m/2位置放左边的人,m/2-m-1放右边的人,因为左右两边的人站的顺序是先左后右,故每次增量为2,而且左边的开始一个人为t+1,第二个是t+2,保证了左边第一个是小于等于最中间的,右边第一个小于等于左边第一个的。
代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
struct node {
string name;
int height;
};
bool com(node a,node b) {
return a.height != b.height ? a.height > b.height:a.name < b.name;
}
int main() {
int n, k, row, m, j, t;
cin >> n >> k;
vector<node> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i].name;
scanf("%d",&v[i].height);
}
sort(v.begin(),v.end(),com);//按照条件排序
row = k, j = 0,t = 0;
while (row) {//对每行进行排序输出
if (k == row) {//row==k表示第一行,m表示每行的人数
m = n - n / k * (k - 1);
}
else {
m = n / k;
}
vector<string> tem(m);
tem[m / 2] = v[t].name;//中间的放最大的人
//放置左边的人
j = m / 2 - 1;
for (int i = t + 1; i < t + m; i+=2) {//因为左右两边是依次去一个次大的数,左边先取大数,右边在取较小数
tem[j--] = v[i].name;
}
j = m / 2 + 1;
for (int i = t + 2; i < t + m; i += 2) {//放置右边的人
tem[j++] = v[i].name;
}
for (int i = 0; i < tem.size(); i++) {
printf("%s%s", tem[i].c_str(), i == tem.size()-1?"\n":" ");
}
row--;
t += m;//更新下一排第一个人的位置
}
system("pause");
return 0;
}