先定义结构图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 }