求调
查看原帖
求调
1050072
a18981826590楼主2025/1/24 21:17

Accepted.

但被自己 HackHack 了。

Input:

1
3
2 1 3

Correct output:

1

My output:

2

Code:

#include<bits/stdc++.h>
#define int long long int
using namespace std;
int a[20],b,d[20]={1},n,t,destination[20]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
map<int,int>c;
int cantor(int z[20]){
	int s=0;
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++) if(z[j]<z[i]) s+=d[n-i];
	}
	return s;
}
void dfs(int step,int z[20]){
	if(step>2) return;
	int zz[20];
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			for(int k=j+1;k<=n;k++){
				for(int l=1;l<i;l++) zz[l]=z[l];
				for(int l=i;l<i-j+k;l++) zz[l]=z[l-i+j+1];
				for(int l=i-j+k;l<=k;l++) zz[l]=z[l+j-k];
				for(int l=k+1;l<=n;l++) zz[l]=z[l];
				c[cantor(zz)]=step;
				dfs(step+1,zz);
			}
		}
	}
}
void dfs0(int step,int z[20]){
	if(step>2) return;
	int zz[20];
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			for(int k=j+1;k<=n;k++){
				for(int l=1;l<i;l++) zz[l]=z[l];
				for(int l=i;l<i-j+k;l++) zz[l]=z[l-i+j+1];
				for(int l=i-j+k;l<=k;l++) zz[l]=z[l+j-k];
				for(int l=k+1;l<=n;l++) zz[l]=z[l];
				if(c.count(cantor(zz))) b=min(b,c[cantor(zz)]+step);
				dfs0(step+1,zz);
			}
		}
	}
}
signed main(){
	for(int i=1;i<16;i++) d[i]=d[i-1]*i;
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++) cin>>a[i];
		if(cantor(a)==0){
			cout<<"0\n";
			continue;
		}
		b=5;
		c.clear();
		c[cantor(a)]=0;
		dfs(1,a);
		if(c.count(0)){
			cout<<c[0]<<'\n';
			continue;
		}
		dfs0(1,destination);
		if(b<5) cout<<b<<'\n';
		else cout<<"5 or more\n";
	}
	return 0;
}
2025/1/24 21:17
加载中...