PAT甲级——A1109 Group Photo【25】

时间:2019-09-02 23:06:16   收藏:0   阅读:92

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

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 (≤), the total number of people, and K (≤), 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:

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

Sample Output:

Bob Tom Joe Nick
Ann Mike Eva
Tim Amy John


 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <algorithm>
 5 using namespace std;
 6 struct Node
 7 {
 8     string name;
 9     int height;
10 }node;
11 bool cmp(Node a, Node b)
12 {
13     if (a.height == b.height)
14         return a.name < b.name;
15     else
16         return a.height > b.height;
17 }
18 int main()
19 {
20     int n, m, k;
21     cin >> n >> k;
22     m = n / k;
23     vector<string>*v = new vector<string>[k];
24     vector<Node>people;
25     for (int i = 0; i < k; ++i)
26     {
27         if (i == 0 && n%k != 0)
28             v[0].resize(m + n % k);
29         else
30             v[i].resize(m);
31     }
32     while (n--)
33     {
34         cin >> node.name >> node.height;
35         people.push_back(node);
36     }
37     sort(people.begin(), people.end(), cmp);
38     int t = 0;
39     for (int i = 0; i < k; ++i)
40     {
41         m = v[i].size();
42         int mid = m / 2, left = mid - 1, right = mid + 1;
43         v[i][mid] = people[t++].name;
44         while (left >= 0 || right < m)
45         {
46             if (left >= 0)
47                 v[i][left--] = people[t++].name;
48             if (right < m)
49                 v[i][right++] = people[t++].name;
50         }
51     }
52     for (int i = 0; i < k; ++i)
53     {
54         for (int j = 0; j < v[i].size(); ++j)
55             cout << v[i][j] << (j == v[i].size() - 1 ? "" : " ");
56         cout << endl;
57     }
58     return 0;
59 }

 

原文:https://www.cnblogs.com/zzw1024/p/11448955.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!