按性别分桶后 male 升序、female 降序两次排序拼接输出,两位小数与单空格分隔。
OJ: roj
题目 ID: 1182
难度:入门
标签:排序入门python
创建: 2026-09-29 22:27
更新: 2026-10-05 04:33
题目描述
n 个人(2 ≤ n ≤ 40,至少 1 男 1 女,身高互异)合影,男生全在左并从矮到高、女生全在右并从高到矮。第一行是 n,随后 n 行各为性别(male/female)与身高;输出 n 个身高,保留两位小数、单空格分隔。样例:输入 6 / male 1.72 / male 1.78 / female 1.61 / male 1.65 / female 1.70 / female 1.56,输出 1.65 1.72 1.78 1.70 1.61 1.56。
思路
按性别分两个桶,男生桶升序、女生桶降序,拼接输出即可;n ≤ 40,桶内排序直接手写冒泡。
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-07-05 21:47
# update_at: 2026-10-04 12:54
import sys
def solve() -> None:
data = iter(sys.stdin.buffer.read().split())
n = int(next(data)) # 人数,2 ≤ n ≤ 40
# 按 (性别, 身高) 分桶:male 升序、female 降序,身高互不相同保证次序唯一
male: list[float] = []
female: list[float] = []
for _ in range(n):
sex = next(data).decode()
height = float(next(data))
(male if sex == "male" else female).append(height)
male.sort()
female.sort(reverse=True)
print(" ".join(f"{h:.2f}" for h in male + female))
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-05 04:33
* update_at: 2026-10-05 04:33
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 45;
ll n;
double male[MAXN]; // 男桶:身高,下标从 1 开始
double female[MAXN]; // 女桶:身高,下标从 1 开始
ll male_cnt;
ll female_cnt;
// 简单冒泡:数组 a[1..len] 升序排序,身高互不相同保证稳定。
void sort_male(double a[], ll len) {
for (ll i = 1; i <= len; i++) {
for (ll j = 1; j <= len - i; j++) {
if (a[j] > a[j + 1]) {
double t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
// 简单冒泡:数组 a[1..len] 降序排序,身高互不相同保证稳定。
void sort_female(double a[], ll len) {
for (ll i = 1; i <= len; i++) {
for (ll j = 1; j <= len - i; j++) {
if (a[j] < a[j + 1]) {
double t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
male_cnt = 0;
female_cnt = 0;
for (ll i = 0; i < n; i++) {
string sex;
double h;
cin >> sex >> h;
if (sex == "male") {
male_cnt++;
male[male_cnt] = h;
}
else {
female_cnt++;
female[female_cnt] = h;
}
}
sort_male(male, male_cnt);
sort_female(female, female_cnt);
// 男段在前、女段在后,每个数保留两位小数,单空格分隔。
for (ll i = 1; i <= male_cnt; i++) {
if (i > 1) cout << ' ';
cout << fixed << setprecision(2) << male[i];
}
for (ll i = 1; i <= female_cnt; i++) {
if (male_cnt > 0 || i > 1) cout << ' ';
cout << fixed << setprecision(2) << female[i];
}
cout << '\n';
return 0;
}