//30分
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define re register int
#define il inline
using namespace std;
il int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
il void print(int x)
{
if(x<0)putchar('-'),x=-x;
if(x/10)print(x/10);
putchar(x%10+'0');
}
const int N=20;
int n,a[N],b[N],ans;
il int abs(int x){return x>=0?x:-x;}
il void swap(int &x,int &y){x^=y^=x^=y;}
il int check()
{
int res=0;
for(re i=1;i<=n;i++)res+=(abs(a[i]-a[i-1])!=1);//
return res;
}
il void flip(int x){for(re i=1,j=x;i<j;i++,j--)swap(a[i],a[j]);}
il void dfs(int t,int maxdep,int pre)
{
int p=check();//,b[N];
if(t+p>maxdep||ans)return;
if(p==0){ans=t;return;}
//for(re i=1;i<=n;i++)b[i]=a[i];
for(re i=2;i<=n;i++)
{
if(abs(a[i]-a[i+1])==1||i==pre)continue;
flip(i);dfs(t+1,maxdep,i);flip(i);
if(ans)return;
}
}
signed main()
{
n=read();a[n+1]=n+1;
for(re i=1;i<=n;i++)a[i]=b[i]=read();
sort(b+1,b+n+1);
for(re i=1;i<=n;i++)a[i]=lower_bound(b+1,b+n+1,a[i])-b;
if(check()==0)putchar('0');
else {
for(re i=1;;i++)
{
dfs(0,i,0);
if(ans){print(i);break;}
}
}
return 0;
}
一组hack数据
输入
11
6 5 3 7 9 8 1 4 2 10 11
输出
8
30分到100分就是这个帖说过的问题,有大佬可以解释吗?