思路分析

首先将姓名和身高用结构体存起来,然后按照身高非递增,身高相同按照名字递增排序,然后就是考察对站位的理解了,假如有四个身高是4 3 2 1 ,则应该先取出4,放到数组4/2的位置,如下第一行, 字母表示暂时未存的数组空间,然后把3放到b位置,把2放到c位置,把1放到a位置,最终站位结果见第二行,最后其实代码就简单了,用m表示中间位置,i和j来进行左右偏移,具体代码如下

 a b 4 c
 1 3 4 2

通过代码

#include<bits/stdc++.h>
using namespace std;
struct info{    //姓名身高结构体
    char name[13];
    int height;
};
info q[10003]; //保存姓名身高
int raw[10003]; //保存[s,e]区间内按照要求站位的结果
bool cmp(info a,info b){        //排序
    if(a.height!=b.height) return a.height>b.height;
    else return strcmp(a.name,b.name)<0;
}
int main(){
    int n,k,s,e;
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>q[i].name;
        cin>>q[i].height;
    }
    sort(q,q+n,cmp); //身高递减,名字递增排序
    s=0;        //初始化s应该为身高最高的,也就是q[0]
    e=n-n/k*k+n/k-1;  //第一次[s,e]中,e应该加上多出来的人
    k=n/k;      //k由行数变成每行的人数
    while(e<n){
        
        int m=(e-s+1)/2;
        int i=m-1;
        int j=m+1;
        raw[m]=s;
        int top=s+1;
        while(top<=e){
            raw[i--]=top++;
            if(top>e) break;
            raw[j++]=top++;
        }
        for(i=0;i<e-s+1;i++){
            if(i) cout<<' ';
            cout<<q[raw[i]].name;
        }
        cout<<endl;    //完成一次区间[s,e]站位
        
        s=e+1;
        e=e+k;
    }
    return 0;
}