题目描述
按照顺序将输入的身高排序并输出。排序的顺序是最后一排(输出的第一行)最高,后面依次变矮,且每一排的中间人最高。
题目分析
我们开辟一个struct,类别为student类,存储名字和身高。声明一个bool类型函数,当身高不同时从大到小排序,相同时按照升序将姓名排序。
当我们输入完成后,先将这个数组从大到小排序。声明一个string类型的数组temp来存储每个student的名字,这个数组的长度会随着每一行的人数的变化而变化。将身高最高的同学的姓名存入temp的中间位置,然后依次填入中间的左边,由于左边是一种非降序,而且左边会比右边的相同位置大,所以我们需要跳着赋值。第一,第三,第五…身高的名字放入temp的左侧(每次移动两个,因为中间的右边的第一个元素要比左边的第二个元素大,所以只能每次跳过一个元素)。同理右边也是如此。但是我们每输出一行的时候都需要将起始位置做一些改变,起始位置+这一行的人数=下一行的起始位置。
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n,k,m;
struct node{
string name;
int height;
}s[10005];
int cmp(node a,node b)
{
if(a.height!=b.height)
return a.height>b.height;
return a.name<b.name;
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>s[i].name>>s[i].height;
}
sort(s,s+n,cmp);
int row=k;
int t=0;
while(row)
{
//通过row的值来判断当前行
if(row==k) m=n-n/k*(k-1);
else m=n/k;
vector<string> tmp(m);
tmp[m/2]=s[t].name;//中间
int j=m/2-1;//左边
//将所有的名字放入数组中输出,先把最大的放入中间位置,然后次大的放左边,两个两个跳着存放
for(int i=t+1;i<t+m;i=i+2)
{
tmp[j--]=s[i].name;
}
j=m/2+1;//右边
for(int i=t+2;i<t+m;i=i+2)
tmp[j++]=s[i].name;
cout<<tmp[0];
for(int i=1;i<m;i++)
cout<<" "<<tmp[i];
cout<<endl;
t=t+m;
row--; //换行
}
return 0;
}
答题用时19min
Q55——finish√