1055 集体照
Statement
Metadata
- 作者: CHEN, Yue
- 单位: 浙江大学
- 代码长度限制: 16 KB
- 时间限制: 400 ms
- 内存限制: 64 MB
拍集体照时队形很重要,这里对给定的
-
每排人数为
(向下取整),多出来的人全部站在最后一排; -
后排所有人的个子都不比前排任何人矮;
-
每排中最高者站中间(中间位置为
,其中 为该排人数,除法向下取整); -
每排其他人以中间人为轴,按身高非增序,先右后左交替入队站在中间人的两侧(例如5人身高为190、188、186、175、170,则队形为175、188、190、186、170。这里假设你面对拍照者,所以你的左边是中间人的右边);
-
若多人身高相同,则按名字的字典序升序排列。这里保证无重名。
现给定一组拍照人,请编写程序输出他们的队形。
输入格式
每个输入包含 1 个测试用例。每个测试用例第 1 行给出两个正整数
输出格式
输出拍照的队形。即K排人名,其间以空格分隔,行末不得有多余空格。注意:假设你面对拍照者,后排的人输出在上方,前排输出在下方。
输入样例
输出样例
Solution
#include <bits/stdc++.h>
using namespace std;
#define MAXN 10000
struct pp {
string s;
int n;
} q[MAXN], p[MAXN];
int comp(pp x, pp y) {
if (x.n != y.n)
return x.n > y.n;
else
return x.s < y.s;
}
void lists(int a[], int x) {
memset(a, 0, sizeof(a));
int i, j, k, l;
l = x / 2 + 1;
for (i = l - 1, j = l, k = 0; k < x; k++) {
if (k % 2 == 1 || k == 0) {
a[i] = k;
i--;
} else {
a[j] = k;
j++;
}
}
}
int a[MAXN];
int main() {
int N, K, n, m;
int i, j, k, l;
string s = "";
cin >> N >> K;
n = floor(N / K);
m = N + n - n * K;
for (i = 0; i < N; i++) cin >> q[i].s >> q[i].n;
sort(q, q + N, comp);
lists(a, m);
for (i = 0; i < m; i++) p[i] = q[i];
for (i = 0; i < m; i++) s += p[a[i]].s, s += " ";
s.erase(s.size() - 1, 1);
cout << s << endl;
s.clear();
lists(a, n);
for (; i < N; i += n) {
for (j = i, k = 0; k < n; j++, k++) p[k] = q[j];
for (j = 0; j < n; j++) s += p[a[j]].s, s += " ";
s.erase(s.size() - 1, 1);
cout << s << endl;
s.clear();
}
}
Last update: May 4, 2022