铁盘整理 30分
查看原帖
铁盘整理 30分
109220
Farkas_W楼主2021/10/14 16:39
//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

\quad30分到100分就是这个帖说过的问题,有大佬可以解释吗?

2021/10/14 16:39
加载中...