Formation is very important when taking a group photo. Given the rules of forming K rows with N people as the following:

  • The number of people in each row must be N/K (round down to the nearest integer), with all the extra people (if any) standing in the last row;
  • All the people in the rear row must be no shorter than anyone standing in the front rows;
  • In each row, the tallest one stands at the central position (which is defined to be the position (m/2+1), where m is the total number of people in that row, and the division result must be rounded down to the nearest integer);
  • In each row, other people must enter the row in non-increasing order of their heights, alternately taking their positions first to the right and then to the left of the tallest one (For example, given five people with their heights 190, 188, 186, 175, and 170, the final formation would be 175, 188, 190, 186, and 170. Here we assume that you are facing the group so your left-hand side is the right-hand side of the one at the central position.);
  • When there are many people having the same height, they must be ordered in alphabetical (increasing) order of their names, and it is guaranteed that there is no duplication of names.

Now given the information of a group of people, you are supposed to write a program to output their formation.

Input Specification:

Each input file contains one test case. For each test case, the first line contains two positive integers N (<=10000), the total number of people, and K (<=10), the total number of rows. Then N lines follow, each gives the name of a person (no more than 8 English letters without space) and his/her height (an integer in [30, 300]).

Output Specification:

For each case, print the formation -- that is, print the names of people in K lines. The names must be separated by exactly one space, but there must be no extra space at the end of each line. Note: since you are facing the group, people in the rear rows must be printed above the people in the front rows.

Sample Input:

  1. 10 3
  2. Tom 188
  3. Mike 170
  4. Eva 168
  5. Tim 160
  6. Joe 190
  7. Ann 168
  8. Bob 175
  9. Nick 186
  10. Amy 160
  11. John 159

Sample Output:

  1. Bob Tom Joe Nick
  2. Ann Mike Eva
  3. Tim Amy John
  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<string>
  5. using namespace std;
  6. typedef struct{
  7. string name;
  8. int high;
  9. }info;
  10. info people[], line[];
  11. bool cmp(info a, info b){
  12. if(a.high != b.high)
  13. return a.high > b.high;
  14. else return a.name < b.name;
  15. }
  16. int main(){
  17. int N, K;
  18. cin >> N >> K;
  19. for(int i = ; i < N; i++){
  20. cin >> people[i].name >> people[i].high;
  21. }
  22. sort(people, people + N, cmp);
  23. int lineSize = N / K;
  24. int lastSize = N - lineSize * (K - );
  25. int index = ;
  26. for(int i = ; i < K; i++){
  27. int len = i == ? lastSize : lineSize;
  28. int mid = len / ;
  29. int left = mid - , right = mid + ;
  30. line[mid] = people[index++];
  31. while(left >= && right < len){
  32. line[left--] = people[index++];
  33. line[right++] = people[index++];
  34. }
  35. if(left == )
  36. line[left--] = people[index++];
  37. for(int j = ; j < len - ; j++){
  38. cout << line[j].name << " ";
  39. }
  40. cout << line[len - ].name << "\n";
  41. }
  42. cin >> N;
  43. return ;
  44. }

总结:

1、题意:按照集体照像的原则排队,每一排站N / K个人,最后一排如果有多的则都站最后一排。每一排都比前一排要高。对于每一排,个子最高的站中间,然后次高的站他的左边,第三高的站他的右边。如此从中间向两边一左一右的安排。 如果有一样高的,则按照姓名字典序排序。

2、本题可以先整体从高到低排序。然后逐行安排,每排完一行就输出该行。使用index作为整体数组的指针,每排完一个人就+1。对于每一排,从中间向两边安排即可。

3、最好不要从前往后排,这样需要保存后统一输出,很麻烦。

A1109. Group Photo的更多相关文章

  1. PAT A1109 Group Photo (25 分)——排序

    Formation is very important when taking a group photo. Given the rules of forming K rows with N peop ...

  2. PAT甲级——A1109 Group Photo【25】

    Formation is very important when taking a group photo. Given the rules of forming K rows with Npeopl ...

  3. PAT_A1109#Group Photo

    Source: PAT A1109 Group Photo (25 分) Description: Formation is very important when taking a group ph ...

  4. 1109 Group Photo

    Formation is very important when taking a group photo. Given the rules of forming K rows with N peop ...

  5. 1109 Group Photo (25 分)

    1109 Group Photo (25 分) Formation is very important when taking a group photo. Given the rules of fo ...

  6. PAT 1109 Group Photo[仿真][难]

    1109 Group Photo(25 分) Formation is very important when taking a group photo. Given the rules of for ...

  7. 1109. Group Photo (25)

    Formation is very important when taking a group photo. Given the rules of forming K rows with N peop ...

  8. PAT 1109 Group Photo

    Formation is very important when taking a group photo. Given the rules of forming K rows with N peop ...

  9. 1109 Group Photo (25分)

    Formation is very important when taking a group photo. Given the rules of forming K rows with N peop ...

随机推荐

  1. php 生成订单号201807205598981

    php版 /** * 生成唯一订单号 */ public function build_order_no() { $no = date('Ymd').substr(implode(NULL, arra ...

  2. Eclipse中修改jsp、html……的编码格式

    一般如果使用的是Eclipse的默认编码格式,在我们保存的时候会提示选择保存的编码格式,保存后英文没有问题,但是中文就会乱码. 修改方式是: Windows——>Preferences——> ...

  3. docker 操作镜像的基本操作

    以安装mysql为例 1.拉取镜像 docker pull mysql 错误的启动 [root@localhost ~]# docker run --name mysql01 -d mysql 42f ...

  4. Mysql优化单表查询

    借助explain分析SQL,判断该怎么建立索引. 还需要注意,有些情况会导致索引失效,用不上索引,应该优化SQL,应用上索引. 什么情况导致索引失效? 1.在索引列上做任何操作(计算.函数.类型转换 ...

  5. python之路--MySQL权限管理 数据备份还原

    一 权限管理 mysql最高管理者是root用户, 这个一般掌握在公司DBA手里, 当你想去对数据库进行一些操作的时候,需要DBA授权给你. 1. 对新用户增删改 1. 创建用户 # 要先use my ...

  6. LeetCode & Online Programming Learning Platform

    leetcode LeetCode is the best platform to help you enhance your skills, expand your knowledge and pr ...

  7. Promise是什么?

    一. Promise是什么? Promise是一种异步操作的解决方案,将写法复杂的传统的回调函数和监听事件的异步操作,用同步代码的形式表达出来. 避免了多级异步操作的回调函数嵌套. Promise最早 ...

  8. cefSharp 开发随笔

    最近用cefSharp开发一点简单的东西.记录一点随笔,不定时更新. 1.用nuget安装完之后,架构要选择x86或者x64,否则编译会报错(截止到Chrome 55版本) 2.向Chrome注册C# ...

  9. C# DataTable 操作

    添加引用 using System.Data; 创建表 //创建一个空表 DataTable dt = new DataTable(); //创建一个名为"Table_New"的空 ...

  10. 【python练习题】程序4

    # 题目:输入某年某月某日,判断这一天是这一年的第几天? import time year = input('输入年份: \n') month = input('输入月份: \n') day = in ...