题解
【基础】合唱队形
1 条题解
-
0
解题思路
合唱队形要求中间高、两端低。先把所有人按身高从矮到高排序,然后最高的站中间,再依次向两端放。
拿 n=7 来看,排序后是:
152 154 157 159 160 162 163
要求的队形是:152 157 160 163 162 159 154
规律:
排序后下标是 0 到 6。最终的队形是:
- 先输出下标 0、2、4、6(偶数下标):152 157 160 163
- 再输出下标 5、3、1(逆序的奇数下标):162 159 154
为什么?因为最高的在中间(163),它左边是比它矮的偶数下标,右边是奇数下标逆序。
思路:
- 排序
- 输出偶数下标 a[0]、a[2]、a[4]……
- 输出逆序的奇数下标 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