一、技术总结
- 首先题目的意思是,要给一群人拍照,然后要选取好位置,给n个人,排成k行,然后每行人数为n/k,最后一排人数为n-n/k*(k-1)。然后人是身高从高到低排,如果身高一样就按字母顺序从后往前排,在同一行中,最高的在中间位置,然后再左边一个次高的再右边一个第三高的,这样排好这一排,具体理解看题中例子。
- 我们首先使用一个结构体将数据存储起来,string类型存储名字,int存储身高。用vector存储,使用cmp函数排序。
- 最后使用一个ans存储每一行的需要输出的结果,在放入的时候需要注意。左右两边分别放,跳两个数存一次,具体参考代码。
二、参考代码
#include<bits/stdc++.h>
using namespace std;
struct node{
int height;
string name;
};
int cmp(struct node a, struct node b){
return a.height != b.height ? a.height > b.height : a.name < b.name;
}
int main(){
int n, k, m;
cin >> n >> k;
vector<node> stu(n);
for(int i = 0; i < n; i++){
cin >> stu[i].name;
cin >> stu[i].height;
}
sort(stu.begin(), stu.end(), cmp);
int t = 0, row = k;
while(row){
if(row == k){
m = n - n/k*(k-1);
}else{
m = n / k;
}
vector<string> ans(m);
ans[m / 2] = stu[t].name;
//左边一列
int j = m / 2 - 1;
for(int i = t + 1; i < t + m; i = i + 2){
ans[j--] = stu[i].name;
}
//右边一列
j = m / 2 + 1;
for(int i = t + 2; i < m + t; i = i + 2){
ans[j++] = stu[i].name;
}
//输出当前排
cout << ans[0];
for(int i = 1; i < m; i++){
cout << " " << ans[i];
}
cout << endl;
t = t + m;
row--;
}
return 0;
}