#include<iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<algorithm> #include<map> #include<vector> #include<queue> #include<string> using namespace std; //双端队列,注意逻辑if for和边界判断 struct node{ string name; int height; }; bool 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; cin>>N>>K;//共N人K排 node t; deque<node> v;//双端队列 int N1=N; while(N--){ cin>>t.name>>t.height; v.push_back(t); }//v队列装入N人结构体 sort(v.begin(),v.end(),cmp);//结构体排序 N=N1; int p=N/K; int lastrow=N-p*(K-1);//末排人数 deque<node> vv;//用于处理一小排 for(int i=0;i<v.size()||vv.size();i++){ if(i<lastrow){//设定lastrow对最后一排特殊处理,但不在这内部打印 if(i%2==0) vv.push_back(v[i]); else vv.push_front(v[i]); }else{ if(i==lastrow||vv.size()==p){//当一排排完 for(int j=0;j<vv.size();j++){//遍历该排的人 cout<<vv[j].name; if(j!=vv.size()-1) cout << " "; else cout<<endl; } vv.clear();//一定要清空该排队列 } if(i<v.size()) //这一句一定要加,否则会爆内存 if(vv.size()%2==0)//交替插入 vv.push_back(v[i]); else vv.push_front(v[i]); } } system("pause"); return 0; }