PAT (Basic Level) Practice (中文)1055 集体照 (25 分) 凌宸1642

题目描述:

拍集体照时队形很重要,这里对给定的 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

题目要求:

作者           CHEN, Yue
单位 浙江大学
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

解题思路:

首先是对所有人员的处理 ,需要按照题目要求对输入的人员的人名以及身高进行排序。

这里我利用的是 struct 结构体sort 函数 分别进行存储数据和排序。

// 第一存储姓名和身高的结构体 peo typedef 的好处自行体会哦!
typedef struct peo{
string name ; // string 类型 用来存储人名 name (因为 string 的比较就是字典序)
int high ; // int 类型 用来存储与 name 对应的 身高值 high
} Peo; // 为满足题目要求,手撕与 sort 配合使用的 cmp 函数
bool cmp(Peo a , Peo b){
if(a.high == b.high)
return a.name < b.name ; // 身高相同的时候, 按照人名的 字典序升序进行排列
return a.high > b.high ; // 身高不等时,按照身高的降序排列
} sort(stu , stu + n , cmp) ; // 对输入的数据 按要求排序,n 为输人的需要排序的人数

然后是将上述中排好序的人,进行排集体照的站位。总共有 k 排,除最后一排外,其余排的人数 x = n / k

故最后一排的人数为 y = n - (k - 1) * x ; 其实接下来就变成了设计一个函数来排好第 m 排的集体照站位即可。

 // 定义一个二维的 string 类型的数组,用来存储 集体照的站位
string s[10][10005];
// 设计一个排集体照第 k 行站位的 函数
void sortPeople(int row , int num){ // 参数说明: 第 row 排 以及该排的人数 num 个
int t = num / 2 + 1 ; // 首先找到 这一排最高的那个人的站位 t
// 计算出在排这一排之前,我们已经有多少人的站位已确定
int index = (row == 0) ? 0 : (row - 1) * x + y ;
// 将剩下最高的人,安置他的站位 t -1 (t - 1)是因为从 0 开始计算
s[row][t - 1] = stu[index].name ;
// 排好中间人后,按照题目要求,中间人为轴先右后左,(对应我们存数据的先低位后高位)
// 先将他的低位排好,因为是先低位后高位,依次轮流 , j 的初值为 1 , 步长为 2
for( int i = t - 2 , j = 1 ; i >= 0 ; i -- , j += 2){
s[row][i] = stu[index + j].name ;
}
// 再将他的高位排好,因为是先低位后高位,依次轮流 , j 的初值为 2 , 步长为 2
for( int i = t , j = 2 ; i < num ; i ++ , j += 2){
s[row][i] = stu[index + j].name ;
}
// 排完左边和右边,本排的 集体照站位 已经全部完成。
}

最后是对每一排调用一下 sortPeople() 函数

// 最后一排的人数与其他排不一致,先排好最后一排
sortPeople(0 , y) ;
// 剩下的 k - 1 排,直接利用 for 循环进行调用即可
for(int i = 1 ; i < k ; i ++){
sortPeople(i , x) ;
}

完整代码:

#include<bits/stdc++.h>
using namespace std ;
#define MAX 10005
typedef struct peo {
string name ;
int high ;
} Peo ;
Peo stu[MAX] ;
int n , k , x , y ;
string s[10][MAX];
bool cmp(Peo a , Peo b){
if(a.high == b.high)
return a.name < b.name ;
return a.high > b.high ;
}
// 从最后一排开始,往前排
void sortPeople(int row , int num){ // 第 row 排 以及该排的人数 num 个
int t = num / 2 + 1 ;
int index = (row == 0) ? 0 :(row - 1 * x + y ;// 前面已经排了index个人了
s[row][t - 1] = stu[index].name ;
for( int i = t - 2 , j = 1 ; i >= 0 ; i -- , j += 2){
s[row][i] = stu[index + j].name ;
}
for( int i = t , j = 2 ; i < num ; i++ ,j += 2){
s[row][i] = stu[index + j].name ;
}
}
int main(){
cin >> n >> k ;
for(int i = 0 ; i < n ; i++){
cin>>stu[i].name>>stu[i].high;
}
sort(stu , stu + n , cmp) ;// 按照题目要去排序;
// for(int i = 0 ; i < n ; i++){
// cout<<stu[i].name<<stu[i].high<<endl;
// }
x = n / k ; // 前 k-1排人数
y = n - (k - 1 ) * x; // 最后一排的人数
sortPeople(0 , y) ;
for(int i = 1 ; i < k ; i++){
sortPeople(i , x) ;
}
cout<<s[0][0] ;
for(int i = 1 ; i < y ; i++){
cout<<" "<<s[0][i] ;
}
for(int i = 1 ; i < k ; i++){
cout<<endl ;
cout<<s[i][0] ;
for(int j = 1 ; j < x ; j ++){
cout<<" "<<s[i][j] ;
}
}
cout<<endl;
return 0;
}

最新文章

  1. 在互联网公司参与拍卖是一种怎样的感觉?part 1
  2. jQuery刷新包含的&lt;jsp:include&gt;页面
  3. python cmd下运行中文乱码 策略
  4. php查看网页源代码的方法
  5. bootstrap-table 分页的问题
  6. Azure Automation (4) 按照Azure虚拟机的机器名,设置开关机
  7. 列间距column-gap
  8. Java for LeetCode 168 Excel Sheet Column Title
  9. RESRful API 和 HTTP状态码
  10. bzoj 3196/tyvj p1730 二逼平衡树
  11. Codeforces Round #336 (Div. 2)C. Chain Reaction DP
  12. 【英语】Bingo口语笔记(79) - fish系列
  13. 【Linux/Ubuntu学习8】unbuntu 下播放swf文件
  14. 深度剖析WordPress主题结构(转)
  15. ASP.NET MVC3调用分部视图-PartialView的几种方式(集)
  16. echarts.制作中国地图,点击对应的省市链接到该省份的详细介绍
  17. 关于解决方案和web文件夹放在同一目录路径错误的问题
  18. 对web应用中单一入口模式的理解及php实现
  19. Ubuntu 卸载cario-dock
  20. oracle常用命令收集

热门文章

  1. ThoughtWorks Homework
  2. 如何导出android内部存储的文件(不用root)
  3. NGK Global莫斯科路演:关注内存暴涨和Defi新项目-Baccarat
  4. 【Azure 云服务】如何从Azure Cloud Service中获取项目的部署文件
  5. 微信小程序中input标签高度设置
  6. pwn篇:攻防世界进阶welpwn,LibcSearcher使用
  7. BSOJ 1562 【堆练习】丑数3576
  8. 基于docker搭建jenkins
  9. Django-1.11中文文档-模型Models(一)
  10. Kubernetes 实战 —— 01. Kubernetes 介绍