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