CF1754B Kevin and Permutation
看到 Permutation 就是构造?
Description
构造一个 \(1\sim n\) 的排列 \(p\),使之邻居之差的最小值最大。
Analysis
考虑这样的奇异思路。
把 \(1\sim n\) 一剖两半,分别为 \(1\sim\lfloor\frac{n}{2}\rfloor\) 和 \(\lfloor\frac{n}{2}\rfloor +1\sim n\)。分别倒序取值输出。
这样保证了相邻两数的差值最小为 \(\lfloor\frac{n}{2}\rfloor\)。
Code
为了简化对于奇数 \(n\) 的处理,此处采用 vis 去处理此时中间的 \(\frac{n+1}{2}\)。
#include <stdio.h>
int n; bool vis[1005];
inline void Solve() {
scanf("%d", &n); for (int i = 1; i <= n; ++i) vis[i] = false;
for (int i = 1; i <= n + 1 >> 1; ++i) {
if (!vis[(n + 1 >> 1) - i + 1]) printf("%d ", (n + 1 >> 1) - i + 1), vis[(n + 1 >> 1) - i + 1] = true;
if (!vis[n - i + 1]) printf("%d ", n - i + 1), vis[n - i + 1] = true;
}
putchar('\n');
}
int main(void) {
int T; for (scanf("%d", &T); T--; ) Solve();
return 0;
}
The end. Thanks.
(拇指点点

浙公网安备 33010602011771号