PTA刷题Basic篇——1055.集体照——Day(28)

题目描述

在这里插入图片描述
在这里插入图片描述
按照顺序将输入的身高排序并输出。排序的顺序是最后一排(输出的第一行)最高,后面依次变矮,且每一排的中间人最高。

题目分析

我们开辟一个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√

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值