1055 集体照

 

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct node {
    string name;
    int height;
};
int 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, m;
    cin >> n >> k;//N是总人数	一共有K排
    vector<node> stu(n);//stu存放所有学生信息 
    for(int i = 0; i < n; i++) {
        cin >> stu[i].name >> stu[i].height;
    }
    //身高从大到小排列 
    sort(stu.begin(), stu.end(), cmp); 
    //排序后第一个学生是最高的,t从最高的学生开始 
    int t = 0, row = k;
    //row从最后一排(第一行)开始,不断往前 
    while(row) {
        if(row == k)//如果是最后一排(第一行) 
        	//总人数 - 前面的排数(k-1) * 前面每一排的人数(n/k) 
            m = n - n / k * (k - 1);//m代表这一行的人数 
        else
            m = n / k;
        vector<string> ans(m);//ans存放当前排的学生 
        ans[m / 2] = stu[t].name;//最中间的学生最高的 
        // 左边一列,从中间到最左边 
        int j = m / 2 - 1;
        for(int i = t + 1; i < t + m; i = i + 2)
            ans[j--] = stu[i].name;
        // 右边一列,从中间到最右边 
        j = m / 2 + 1;
        for(int i = t + 2; i < t + m; i = i + 2)
            ans[j++] = stu[i].name;
        // 输出当前排
        cout << ans[0];
        for(int i = 1; i < m; i++)
            cout << " " << ans[i];
        cout << endl;
        t = t + m;
        row--;
    }
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值