hdu1685

来源:互联网 发布:自制4g网络信号增强器 编辑:程序博客网 时间:2024/05/19 15:23
蒟蒻的提生
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cmath>using namespace std;int save[20],n,m,len,ans;void  change(int *a,int p1,int p2,int p3){     int tmp[20];     for (int i=p1;i<=p2;i++)         tmp[i]=a[i];     for (int i=p2+1;i<=p3;i++)         a[i-p2+p1-1]=a[i];     for (int i=p1+p3-p2;i<=p3;i++)         a[i]=tmp[i+p2-p3];}int h(int p[]){    int val=0;    if(p[1]!=1)        val=1;    for(int i=1;i<n;i++)        if(p[i+1]!=p[i]+1)            val++;    val=(val+2)/3;    return val;}bool dfs(int dep,int p[]){    int val=h(p);    if(val==0) {ans=dep;return true;}    if(dep+val>len) return false;        if(dep>len)return false;    int tmp[20]={0};    /*    printf("%d\n",dep);    for(int i=1;i<=n;i++)    {        printf("%d ",p[i]);    }    printf("\n");    system("pause");*/    for(int i=1;i<n;i++)    {        for(int j=i+1;j<=n;j++)        {            for(int k=i;k<j;k++)            {               for(int l=1;l<=n;l++)               {                   tmp[l]=p[l];               }               change(tmp,i,k,j);               if(dfs(dep+1,tmp))                    return 1;            }        }    }    return 0;}int main(){    int cases;    scanf("%d",&cases);    while(cases--)    {        ans=0;        scanf("%d",&n);        for(int i=1;i<=n;i++) scanf("%d",&save[i]);        len=1;        if(h(save)==0)        {            printf("0\n");            continue;        }        while(1)        {            if(dfs(0,save))break;                len++;            if(len>=5){ans=5;break;}        }        printf("%d",ans);        if(ans>=5)        {            printf(" or more");        }        printf("\n");    }    return 0;}

。。。
0 0
原创粉丝点击