代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Stu{
string name;
int height;
};
int compare(Stu a, Stu b){
if(a.height!=b.height){
return a.height>b.height;
}
else{
return a.name<b.name;
}
}
int main() {
int n, K;
cin>>n>>K;
Stu stu[n];
for(int i=0; i<n; i++){
cin>>stu[i].name>>stu[i].height;
}
sort(stu, stu+n, compare);
int remind = n%K;
int eachRowStuNum = n/K;
vector<int> v;
for(int i=0; i<K; i++){
if(i==0){
int tmp = remind + eachRowStuNum;
v.push_back(tmp);
n -= tmp;
}
else{
v.push_back(eachRowStuNum);
n -= eachRowStuNum;
}
}
int nowPos = 0;
for(int i=0; i<v.size(); i++){
int tmp = v.at(i);
string a[tmp];
int count = 0;
// fill the medium
int media = tmp/2;
a[media] = stu[nowPos++].name;
count++;
while(count<tmp){
//fill left
if(count%2){
a[media-count/2-1] = stu[nowPos++].name;
count++;
}
//fill right
else{
a[media+count/2] = stu[nowPos++].name;
count++;
}
}
cout<<a[0];
for(int j=1; j<tmp; j++){
cout<<" "<<a[j];
}
cout<<endl;
}
return 0;
}
注解
1、先按题目给定条件,降序排列。要会用compare函数对结构体排序,哪些比较条件,相等如何处理。
int compare(Stu a, Stu b){
if(a.height!=b.height){
return a.height>b.height;
}
else{
return a.name<b.name;
}
}
2、因题目给定了总人数和行数,可求出每一行的人数,依次放入vector中保存。具体代码如下:
int remind = n%K;
int eachRowStuNum = n/K;
vector<int> v;
for(int i=0; i<K; i++){
if(i==0){
int tmp = remind + eachRowStuNum;
v.push_back(tmp);
n -= tmp;
}
else{
v.push_back(eachRowStuNum);
n -= eachRowStuNum;
}
}
3、依次取出vector中的值,和刚才排好序的结构体,按照题目给定条件,每一行中间元素是身高最高的,然后放到左边、右边。依次进行。
定义nowPos是当前轮到的元素序号,tmp是当前行的人数,media是最中间的位置,先填最中间位置,然后依次填两边。用count记录当前行已填的人数,来控制循环的结束。
int nowPos = 0;
for(int i=0; i<v.size(); i++){
int tmp = v.at(i);
string a[tmp];
int count = 0;
// fill the medium
int media = tmp/2;
a[media] = stu[nowPos++].name;
count++;
while(count<tmp){
//fill left
if(count%2){
a[media-count/2-1] = stu[nowPos++].name;
count++;
}
//fill right
else{
a[media+count/2] = stu[nowPos++].name;
count++;
}
}