观察本题的队伍的排列,应该从中间分为左右两侧进行计算,先左后右进行填充。
需要注意一点:题目中给出的ans要加上规模大小,不加的话本题会出现段错误;
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=10010;
struct node
{
string name;
int high;
}a[maxn];
bool cmp(node a,node b)
{
return a.high!=b.high?a.high>b.high:a.name<b.name;
}
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i].name>>a[i].high;
}
sort(a,a+n,cmp);
int row=k,m,t=0;
while(row)
{
if(row==k)
{
m=n-n/k*(k-1);;
}
else
{
m=n/k;
}
vector<string> ans(m);
ans[m/2]=a[t].name;
for(int i=m/2-1,j=t+1;i>=0;i--,j+=2)
{
ans[i]=a[j].name;
}
for(int i=m/2+1,j=t+2;i<m;i++,j+=2)
{
ans[i]=a[j].name;
}
for(int i=0;i<m;i++)
{
cout<<ans[i];
if(i!=m-1)
printf(" ");
}
cout<<endl;
row--;
t=t+m;
}
}