1. 思路
- 所有人从高到低排序(struct 实现)
- 一共要输出k行,每行输出m个人,对m进行讨论,第一行 m = n/k + n%k,其余行都是m = n/k
- 遍历排好序的stu结构体,每行输出m个
- 对于每一行,用两个vector: left 和 right, 分别存放站在左边的人和右边的人,然后先打印left,再打印right
2. 代码(C++)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
struct Student{
string name;
int height;
}stu[10010];
bool cmp(Student a, Student b)
{
if(a.height != b.height) return a.height > b.height;
else return strcmp(a.name.c_str(), b.name.c_str()) < 0;
}
int main(){
int n, k;
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i++)
{
cin>>stu[i].name>>stu[i].height;
}
sort(stu+1, stu+n+1, cmp);
int m;
int start = 1, end = 0;
for(int i = 1; i<=k; i++)
{
if(i == 1)
{
m = n/k + n%k;
end = m;
}
else
{
m = n/k;
end += m;
}
int mid = (start + end) / 2 + 1;
vector<string> left;
vector<string> right;
right.push_back(stu[start].name);
start++;
while(start <= end)
{
if(start <= end)
{
left.push_back(stu[start].name);
start++;
}
if(start <= end)
{
right.push_back(stu[start].name);
start++;
}
}
bool is_left = false;
for(int j = left.size()-1; j >=0; j--)
{
if(j != left.size() - 1) printf(" ");
cout<<left[j];
is_left = true;
}
for(int j = 0; j < right.size(); j++)
{
if(is_left)
printf(" ");
cout<<right[j];
}
if(i != k)
printf("\n");
}
return 0;
}