1055 集体照 (25 分)

拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下:

每排人数为 N/K(向下取整),多出来的人全部站在最后一排;

后排所有人的个子都不比前排任何人矮;

每排中最高者站中间(中间位置为 m/2+1,其中 m 为该排人数,除法向下取整);

每排其他人以中间人为轴,按身高非增序,先右后左交替入队站在中间人的两侧(例如5人身高为190、188、186、175、170,则队形为175、188、190、186、170。这里假设你面对拍照者,所以你的左边是中间人的右边);

若多人身高相同,则按名字的字典序升序排列。这里保证无重名。

现给定一组拍照人,请编写程序输出他们的队形。

输入格式:

每个输入包含 1 个测试用例。每个测试用例第 1 行给出两个正整数 N( ≤ 10^4 ,总人数)和 K( ≤ 10,总排数)。随后 N 行,每行给出一个人的名字(不包含空格、长度不超过 8 个英文字母)和身高([30, 300] 区间内的整数)。

输出格式:

输出拍照的队形。即K排人名,其间以空格分隔,行末不得有多余空格。注意:假设你面对拍照者,后排的人输出在上方,前排输出在下方。

输入样例:

10 3
Tom 188
Mike 170
Eva 168
Tim 160
Joe 190
Ann 168
Bob 175
Nick 186
Amy 160
John 159
结尾无空行

输出样例:

Bob Tom Joe Nick
Ann Mike Eva
Tim Amy John
结尾无空行

解题思路:

此题很难理解,但只要耐心点还是能搞懂的
先按条件将数据按降序排序:
Joe 190
Tom 188
Nick 186
Bob 175
Mike 170
Ann 168
Eva 168
Amy 160
Tim 160
John 159
此时这个排序就很有意思了,我们先从最后一排开始排序:
①计算得出的最后一排的人数为4,那就先抽出前4个数:190 188 186 175,排序:
最大在中间为190,然后就是188(左) 186(右)175(左)
②计算得出最后一排人数为5,那就先抽出前5个数:190 188 186 175 170,排序:
最大在中间为190,然后就是188(左) 186(右)175(左)170(右)
原理就是如此,那么此时你会发现,左右两侧的数与数之间的间隔是相差2的

代码示例:

#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <string>
#include <cmath>
#include <numeric>
#include <map>/* 排序后:
Joe 190
Tom 188
Nick 186
Bob 175
Mike 170
Ann 168
Eva 168
Amy 160
Tim 160
John 159
*/using namespace std;struct st
{string name;int height;
};bool Sort(st h1, st h2)
{if (h1.height != h2.height){return h1.height > h2.height;}else{return h1.name < h2.name;}
}int main()
{int humans, row; //总人数与排数cin >> humans >> row;vector<st> s(10005);for (int i = 0; i < humans; i++){cin >> s[i].name >> s[i].height;}sort(s.begin(), s.end(), Sort); //对结构体按条件排序int temp_row = row; //用于获取最后一排人数int cnt = row; //循环次数int members = 0; //获取每排人数int index = 0; //结构体数组下标while (cnt--){if (temp_row == row){members = humans - (humans / row) * (row - 1); //获取最后一排人数:总人数 - 其余排的人数temp_row = 0; //将其效果销毁}else{members = humans / row;//获取其余排人数}vector<string> ans(members);//中间位置int mid = members / 2;ans[mid] = s[index].name;//左侧int left = mid - 1;for (int i = index + 1; left >= 0; i += 2)//i += 2是为了错位,满足左侧数与数之间相差2的特点{ans[left] = s[i].name;left--;}//右侧int right = mid + 1;for (int i = index + 2;  right < members; i += 2){ans[right] = s[i].name;right++;}int flag = 1; //控制输出for (int i = 0; i < ans.size(); i++){if (flag > 1){cout << " ";}cout << ans[i];flag++;}cout << endl;index += members;//注意:结构体下标要改变初始值}}

运行结果:

PTA 1055 集体照 (25 分) C++实现相关推荐

  1. C++学习之路 | PTA乙级—— 1055 集体照 (25 分)(精简)

    1055 集体照 (25 分) 拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每排人数为 N/K(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任 ...

  2. 【Python】 1055 集体照 (25 分)

    1. 题目: 题目地址: https://pintia.cn/problem-sets/994805260223102976/problems/994805272021680128 1055 集体照 ...

  3. PAT乙级刷题之路1055 集体照 (25分)

    1055 集体照 (25分) 拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每排人数为 N/K(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何 ...

  4. 1055 集体照 (25 分)(详解)

    拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每排人数为 N/K(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排中最高者站中间(中 ...

  5. 【PAT乙级】1055 集体照 (25 分)

    题目地址 #include<bits/stdc++.h> using namespace std; const int N=1e5+10; struct node {string name ...

  6. 1109 Group Photo (25分)/1055 集体照 (25分)后三个测试点

    这个题目很坏,如果是后三个测试点不对,一定是读题没准确. 题目给的第二个输入变量为行数 M/K等于每行人数(除最后一行) 把这两个搞混了只能过前三个测试点. 题目分析: 关于m/2+1其实没必要,以最 ...

  7. 1055. 集体照 (25)

    1055. 集体照 (25) 时间限制 400 ms 内存限制 65536 kB  乙级练习题解目录 拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下: 每排人数为N/K(向下取整) ...

  8. PTA 星际探险 (25分)(Dijkstra改约束条件)

    7-15 星际探险 (25分) 在某个遥远的未来,新新人类将可能这样进行星际探险:宇宙中分布着若干个跳跃点,人类飞船在每个跳跃点可超光速跳至其它跳跃点.当然,一般来说每次跳跃是要消耗一定能量的,但因为 ...

  9. 1055. 集体照 (25)-PAT乙级真题

    拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下: 每排人数为N/K(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排中最高者站中间(中间位置为m ...

最新文章

  1. RxJava 过滤操作符skip 与 skipLast
  2. 数据库Mysql的学习(八)-储存过程和事务和导入导出
  3. 连续地址数据(数组或者malloc的内存)作为函数参数
  4. java,将Image变量保存成图片
  5. 理解神经网络函数高频成分的收敛率界限
  6. 你的IP地址是不是经常被发现
  7. 使用EHCache需要注意的几个问题(转)
  8. Spring集成–强大的拆分器聚合器
  9. 第五十七期:小型企业将如何从5G中受益
  10. Qt 5.14 安装,windows10系统,64位,详细步骤,非常简单!
  11. Golang语言基础课件
  12. hdu1005 Number Sequence(寻找循环节)
  13. 网络协议从入门到底层原理(10)WebSocket、WebService、RESTful、HTTPDNS、FTP文件传输协议、邮件相关协议、IPv6
  14. 【天池大数据赛题解析】资金流入流出预测(附Top4答辩ppt)
  15. 西门子V90 PN控制FB284块的个人理解
  16. linux下vivado编译卡死,vivado+zedboard之Linux编译
  17. c语言算无限小数,随机算式的除法如果答案是无限循环小数,怎么加精度?
  18. SQL server中表数据自动生成拼音码
  19. t.cn短链接是怎么生成的?
  20. kaptcha生成自定义图片验证码

热门文章

  1. Excel合并单元格读取
  2. 编写一个制造各种车辆的程序。包含三个类,具体要求如下: (1)基类Vehicle,包含轮子数和汽车自身重量两个属性,一个两参数的构造方法,一个显示汽车信息的方法; (2)小轿车类Car,增加载客数属性
  3. 手把手教你如何用python制作自动翻译程序
  4. 还在问视频音频转文字软件哪个好吗?快码住这两款
  5. oracle 近一年,华为Mate 20 Pro发布近一年,仍受追捧,四个方面告诉你原因
  6. Jetson Agx Orin使用最正确的方式安装torch1.11.0,torchvision0.12.0,torchaudio0.11.0保姆级教程
  7. 基于opencv-python的车道线检测(高级)
  8. ORACLE ORDER BY用法总结
  9. 赚多多V10自动抢单系统源码_派单连单管理新增设置订单佣金
  10. 三星S5终于降临 4月上市开卖的新机盘点