题目有些难读懂。
大致意思是:
(1)每行人有n/k个,如果有多则都排在最后一行。
(2)最后一行的人比前行的人都要高
(3)每行中最高的人站在中间。
(4)每行第二高的人站在最高人的左边,第三高的人站在最高人的右边,依次类推。
(5)如果有相同身高的人,要以字母表顺序排列。
AC代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#include<hash_map>
#define ll long long
#define inf 24*60*60
using namespace std;
struct node
{
string name;
int hei;
};
node a[10005];
bool cmp(node x,node y)
{
if(x.hei!=y.hei)
{
return x.hei<y.hei;
}
else
{
return x.name>y.name;
}
}
vector<string> v[15] ;
int main()
{
int n,m;
int o;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
{
cin>>a[i].name>>a[i].hei;
}
for(int i=0;i<15;i++)
{
vector<string> v1(10005);
v[i]=v1;
}
sort(a,a+n,cmp);
int len=n/m;
for(int i=0;i<m;i++)
{
if(i!=m-1)
{
int d=len/2;
//cout<<d<<endl;
v[i][d]=a[i*len+len-1].name;
//cout<<1<<endl;
int l=-1;
int r=1;
int flag=0;
for(int j=i*len+len-2;j>=i*len;j--)
{
if(flag==0)
{
v[i][d+l]=a[j].name;
flag=1;
l--;
}
else
{
v[i][d+r]=a[j].name;
flag=0;
r++;
}
}
}
else
{
o=n-len*(m-1);
int d=o/2;
v[i][d]=a[n-1].name;
int l=-1;
int r=1;
int flag=0;
for(int j=n-2;j>=i*len;j--)
{
if(flag==0)
{
v[i][d+l]=a[j].name;
flag=1;
l--;
}
else
{
v[i][d+r]=a[j].name;
flag=0;
r++;
}
}
}
}
for(int i=m-1;i>=0;i--)
{
cout<<v[i][0];
if(i==m-1)
{
for(int j=1;j<o;j++)
{
cout<<" "<<v[i][j];
}
}
else
{
for(int j=1;j<len;j++)
{
cout<<" "<<v[i][j];
}
}
cout<<endl;
}
}