1109 Group Photo (25 分)

先定义结构图node{name, height},存放姓名和身高。先将所有人按照身高顺序从大到小排好序(因为从最后一排开始输出,最后一排身高最高,所以刚好是从头开始处理),再分组处理,除了最后一排人数是n/k+n%k,其余排的人数均为n/k,引入formation函数,用下标作为参数给出处理范围(下标或范围可由每排人数递推出),逐排处理即可。

需要注意的是formation函数里面的person函数存储数据的下标是[1,size],因为题目的pos=m/2+1的条件就是按这一存储方式给的,若使用[0,size)作为下标则会出错。

注意判断的条件,不让下标越界。

 1 #pragma warning(disable:4996)
 2 #define _CRT_SECURE_NO_WARNINGS
 3 
 4 #include <iostream>
 5 #include <algorithm>
 6 #include <cmath>
 7 #include <vector>
 8 #include <map>
 9 #include <set>
10 #include <unordered_set>
11 #include <unordered_map>
12 #include <queue>
13 #include <cmath>
14 #include <string>
15 #define INFINITE 65535
16 #define mod 1000000007
17 using namespace std;
18 struct node
19 {
20     string name;
21     int h;
22 };
23 bool cmp(node a, node b)
24 {
25     return a.h!=b.h ? a.h > b.h : a.name < b.name;
26 }
27 vector<node> v(10000);
28 int n, k;
29 void formation(int s, int e)
30 {
31     int sz = e - s + 1;
32     vector<node> person(sz+1);//[1,n]下标范围
33     int mid = sz / 2 + 1;
34     person[mid] = v[s];
35     int i = s + 1;
36     int cnt = 1;
37     while (i <= e)
38     {
39         if (mid - cnt >= 1)
40             person[mid - cnt] = v[i];
41         if (i + 1 <= e && mid + cnt <= sz)
42             person[mid + cnt] = v[i + 1];
43         i += 2;
44         ++cnt;
45     }
46     for (int i = 1; i <= sz; ++i)
47     {
48         if (i != 1) cout << " ";
49         cout << person[i].name;
50     }
51     cout << endl;
52 }
53 int main()
54 {    
55     cin >> n >> k;
56     for (int i = 0; i < n; ++i)
57     {
58         cin >> v[i].name >> v[i].h;
59     }
60     sort(v.begin(), v.end(), cmp);
61 
62     formation(0, n / k + n % k - 1);
63     for (int i = n / k + n % k; i < n; i += n / k)
64         formation(i, i + n / k - 1);
65 
66     return 0;
67 }
原文地址:https://www.cnblogs.com/2020R/p/14464297.html