# 神奇的排列## 题目描述对于一个长度为 $2n$ 的排列 $p_1p_2p_2n$定义数组 $s$ 为 $p$ 中两两分组以后每个组的数字之和即 $s_i=p_2i-1+p_2i$可以发现 $s$ 的长度为 $n$。若 $s$ 是一个连续严格递增数列则我们称排列 $p$ 为一个神奇的排列。现在我们给定一个数字 $n$ 请给出一个长度为 $2n$ 可能的神奇的排列 $p$。## 输入格式第一行一
#include <iostream>
#include <vector>
using namespace std;
// 判断是否是连续严格递增数列
bool isIncreasing(vector<int>& s) {
int n = s.size();
for (int i = 0; i < n - 1; i++) {
if (s[i + 1] - s[i] != 1) {
return false;
}
}
return true;
}
int main() {
int T;
cin >> T;
while (T--) {
int N;
cin >> N;
if (N % 2 != 0) {
cout << "N0" << endl;
continue;
}
vector<int> p(N);
// 构造一个神奇的排列
for (int i = 0; i < N; i += 2) {
p[i] = N - i;
}
for (int i = 1; i < N; i += 2) {
p[i] = i;
}
// 计算数组s
vector<int> s(N / 2);
for (int i = 0; i < N / 2; i++) {
s[i] = p[2 * i] + p[2 * i + 1];
}
if (isIncreasing(s)) {
cout << "YE5" << endl;
for (int i = 0; i < N; i++) {
cout << p[i] << " ";
}
cout << endl;
} else {
cout << "N0" << endl;
}
}
return 0;
}
该算法的思路是先构造一个满足题意的排列,然后判断排列中的数组s是否是连续严格递增数列。算法的时间复杂度为O(N)
原文地址: https://www.cveoy.top/t/topic/iG4E 著作权归作者所有。请勿转载和采集!