我是打表找规律 A 的。
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MAXN 1000001
int n, minn, ans(INT_MAX), maxn, ind;
int a[MAXN], g[MAXN];
void solve1(){
iota(a+1, a+n+1, 1);
do{
if (a[1] != 1) break;
minn = INT_MAX;
maxn = 0;
for (int i(1); i<=n; ++i){
minn = min(minn, a[i]+a[i%n+1]);
maxn = max(maxn, a[i]+a[i%n+1]);
}
if (ans > maxn-minn){
ans = maxn-minn;
memcpy(g, a, (n+1)<<3);
}
}while (next_permutation(a+1, a+n+1));
for (int i(1); i<=n; ++i) cout << g[i] << ' ';
}
void solve2(){
for (int i(1); i<=n; ++i){
if (i & 1) cout << i << ' ';
else cout << (n+1-i) << ' ';
}
}
void solve3(){
vector<pair<int, int>> vec;
for (int i(2); i<=(n>>1); i+=2) vec.push_back(make_pair(i, n+2-i));
ind = n+1;
for (auto i: vec){
a[--ind] = i.second;
a[--ind] = i.first;
}
if ((n>>1)&1) a[(n>>1)+1] = (n+2)>>1;
reverse(a+(n>>1)+1, a+n+1);
for (int i(1); i<=(n>>1); ++i) a[i] = (n+1)-a[i+(n>>1)];
reverse(a+(n>>1)+1, a+n+1);
for (int i(1); i<=n; ++i) cout << a[i] << ' ';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
if (n <= 8) solve1();
else if (n & 1) solve2();
else solve3();
return 0;
}
请问这个的正确性可以证明吗?