目录
一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
622D - Optimal Number Permutation |
二、解题报告
1、思路分析
第一感觉就是 能否构造出一个方案使得答案为0?
如果这样,两个1之间距离为n - 1
2之间为n - 2
3之间为n - 3
……
n 之间随意,因为n - i = 0
2 * n 的数组我们分为两部分,左边放奇数,从下标<0, n - 1>开始构造奇数组成的回文串,右边放偶数,从下标<n, 2 * n - 2> 开始构造偶数组成的偶回文串
最后剩下两个空位置放n
对于上面的构造法可以手玩一下加深理解
2、复杂度
时间复杂度: O(N)空间复杂度:O(N)
3、代码详解
#include <bits/stdc++.h>
using i64 = long long;
using i32 = unsigned int;
using u64 = unsigned long long;
using i128 = __int128;
constexpr int inf32 = 1E9 + 7;
constexpr i64 inf64 = 1E18 + 7;
constexpr int P = 1'000'000'007;
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n << 1);
for (int i = 1, j = 0; i < n; i += 2, ++ j)
a[j] = a[j + n - i] = i;
for (int i = 2, j = n; i < n; i += 2, ++ j)
a[j] = a[j + n - i] = i;
for (int i = 0; i < n * 2; ++ i)
if (!a[i])
a[i] = n;
for (int x : a) std::cout << x << ' ';
}
auto FIO = []{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
int main () {
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int T = 1;
// std::cin >> T;
while (T --)
solve();
return 0;
}