题目链接<==戳这
这题要注意几个点:
1.我们应该从左往右交替站入
2.如何实现左右交替站入:把 i++ 改为 i+=2 即每次加2
3.利用vector的时候,如果要直接对其中的元素赋值,或者直接输入该元素,不能定义成类似于 vector < int > v ;
而应该是:vector < int > v (n+1) ;(n也可以);
4.用结构体储存每个人的身高和名字
5.从我们的角度看,最后一排应该是输出的第一行,即多余的全部输出在第一行
上代码理解:
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
struct node{
//储存信息string name; //名字int height; //身高
};
bool cmp(node a,node 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;vector<node> v(n+1); //储存每一个人的信息for(int i=0;i<n;i++){
cin>>v[i].name>>v[i].height;}sort(v.begin(),v.end(),cmp); //从高到矮排序int per=n/k,last=n-n/k*(k-1);//per代表输出中: 2-k 行每行的人数,last代表输出中:第一行的人数int t=0,row=k,m; // t 代表每一行的最高的人在 v 中的下标,初始化为0// row 为行数,初始化为 k// m 为临时变量储存当前行的人数while(row){
if(row==k) m=last;else m=per;vector<string> ans(n+1); //储存左右交替站入后的排列(结果)ans[m/2]=v[t].name; //先给中间元素赋值int pos=m/2; //pos代表当前正在站入ans[pos]这个位置for(int i=t+1;i<=t+m-1;i+=2){
//最高的人的左边ans[--pos]=v[i].name;}pos=m/2;for(int i=t+2;i<=t+m-1;i+=2){
//最高的人的右边ans[++pos]=v[i].name;}for(int i=0;i<m;i++){
cout<<ans[i];if(i!=m-1) putchar(' ');else putchar('\n');}t+=m; //更新 t 和 row 的值row--;}
}