关于 Div2 B 题
  • 板块学术版
  • 楼主rainygame
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/8/26 18:01
  • 上次更新2023/11/3 01:03:34
查看原帖
关于 Div2 B 题
804607
rainygame楼主2023/8/26 18:01

我是打表找规律 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;
}

请问这个的正确性可以证明吗?

2023/8/26 18:01
加载中...