模拟题,题意是给你n个人的名字和身高,将其排成k行,然后最高的站中间,每个人左边比右边身高高,然后将其输出
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<string>
#include<string.h>
#include<stack>
using namespace std;
struct Team {
string name;
int high;
}s[10005];
int cmp(const Team& a, const Team& b)
{
if (a.high != b.high)
return a.high<b.high;
else
return a.name>b.name;
}
int main() {
int n, k, mod, t;
int ans[11][10005];
int col[11];
scanf("%d %d", &n, &k);
for (int i = 0; i < n; i++) {
cin >> s[i].name >> s[i].high;
}
sort(s, s + n, cmp);
t = n / k;
int l, r;
t = n / k;
for (int i = 1; i <= k; i++) {
l = (i - 1)*t;
r = i*t - 1;
if (i == k) {
t = n - (k - 1)*t;
r = n - 1;
}
col[i] = t;
int mid = t / 2 + 1;
int index = r;
ans[i][mid] = index;
index--;
int ll = mid - 1, rr = mid + 1;
while (rr <= t) {
ans[i][ll] = index;
index--;
ans[i][rr] = index;
index--;
ll--, rr++;
}
if (ll == 1) {
ans[i][ll] = index;
}
}
for (int i = k; i >= 1; i--) {
for (int j = 1; j <= col[i]; j++) {
if (j == 1) {
cout << s[ans[i][j]].name;
}
else {
cout << " " << s[ans[i][j]].name;
}
}
cout << endl;
}
}