top1编程
← 返回题目
题解

【基础】合唱队形

1 条题解

  • 0
    @ 2026-7-31 11:55:43

    解题思路

    合唱队形要求中间高、两端低。先把所有人按身高从矮到高排序,然后最高的站中间,再依次向两端放。

    拿 n=7 来看,排序后是:

    152 154 157 159 160 162 163

    要求的队形是:152 157 160 163 162 159 154

    规律:

    排序后下标是 0 到 6。最终的队形是:

    1. 先输出下标 0、2、4、6(偶数下标):152 157 160 163
    2. 再输出下标 5、3、1(逆序的奇数下标):162 159 154

    为什么?因为最高的在中间(163),它左边是比它矮的偶数下标,右边是奇数下标逆序。

    思路:

    1. 排序
    2. 输出偶数下标 a[0]、a[2]、a[4]……
    3. 输出逆序的奇数下标 a[n-2]、a[n-4]……

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int n, a[61];
        cin >> n;
        for (int i = 0; i < n; i++) cin >> a[i];
    
        // 按身高从小到大排序
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < n - i; j++) {
                if (a[j] > a[j + 1]) {
                    int t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
                }
            }
        }
    
        // 先输出偶数下标
        for (int i = 0; i < n; i += 2) cout << a[i] << " ";
        // 再逆序输出奇数下标
        for (int i = n - 2; i >= 0; i -= 2) cout << a[i] << " ";
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N²),冒泡排序
    • 空间复杂度:O(N),一个数组存身高
    • 1