题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805272021680128
经验总结:
将所有人员数据放入一个一维的vector里面,然后排序。之后将这个排好序的一维vector依次放入到二维的vector里面。之后输出这个二维vector。在二维vector里面:先定位到此排最高位的位置,并返回其迭代器位置,然后用flag标记正负,左右来回摆动安放人员数据。
记:由于vector的resize方法需要初始化数据,所以如果是vector容器里装struct(或class)的话,struct(或class)里应该含有空参构造函数,否则resize会报错。
记:由于vector内部没有自动排序,所以比较函数写在struct里面之后需要手动sort排序下,或者sort排序时添加自定义的cmp函数。
C++代码:
#include <bits/stdc++.h>
using namespace std;
struct person{
string name;
int height;
person(){}; //如果装进vector并且需要resize的话,需要加上空参构造函数
person(string name,int height):name(name),height(height){};
};
bool cmp(person a,person b){
if(a.height == b.height){
return a.name<b.name;
}
return a.height>b.height;
}
int main()
{
int n,k;
cin>>n>>k;
vector<person> v(n);
int row_num = n/k;
for(int i=0;i<n;i++){
cin>>v[i].name>>v[i].height;
}
sort(v.begin(),v.end(),cmp);
vector<vector<person> > row(k,vector<person>(row_num));
row[0].resize(row_num+n-row_num*k); //最后一排(可能有多余的)
for(auto it=v.begin();it!=v.end();){
for(int i=0;i<k;i++){
int flag = 1;
auto row_it = row[i].begin()+row[i].size()/2; //定位此排身高最高人员迭代器
for(decltype(row[i].size()) j=0;j<row[i].size();j++){
row_it += flag*j; //左右摆动安放人员数据
*row_it = *it;
it++;
flag *= -1;
}
}
}
for(int i=0;i<k;i++){
cout<<row[i][0].name;
for(auto it=row[i].begin()+1;it!=row[i].end();it++){
cout<<" "<<it->name;
}
cout<<endl;
}
return 0;
}