IDA* 但是 TLE 80分 on 3 4
查看原帖
IDA* 但是 TLE 80分 on 3 4
310818
蒟酱厂妹楼主2022/7/9 17:27
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cassert>
#define siz(x) int((x).size())
#define cauto const auto
#define all(x) (x).begin(),(x).end()
using std::cin;using std::cout;
using loli=long long;
using venti=__int128_t;
using pii=std::pair<int,int>;
constexpr int kN=17;
int n,a[kN],dep;
std::basic_string<int>b;
bool dfs(int now,int h,int pre){
	if(now==dep)return !h;
	for(int i=2;i<=n;i++){
		if(i==pre||abs(a[i+1]-a[i])==1)continue;
		std::reverse(a+1,a+1+i);
		int nh=h-(abs(a[i+1]-a[i])==1);
		if(now+nh<=dep&&dfs(now+1,nh,i))return true;
		std::reverse(a+1,a+1+i);
	}
	return 0;
}
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	std::ios::sync_with_stdio(false);cin.tie(nullptr);
	cin>>n;a[n+1]=n+1;
	for(int i=1;i<=n;i++)cin>>a[i],b+=a[i];
	std::sort(all(b));b.erase(std::unique(all(b)),b.end());
	for(int i=1;i<=n;i++)a[i]=int(std::lower_bound(all(b),a[i])-b.begin())+1;
	for(dep=0;;dep++)if(dfs(0,[]{
		int h=0;for(int i=1;i<=n;i++)h+=(abs(a[i]-a[i+1])!=1);return h;
	}(),0))return cout<<dep,0;
}

求助

2022/7/9 17:27
加载中...