题目描述
输入输出格式
输入格式:
共两行。第一行为铁盘个数N(1<=N<=50),第二行为N个不同的正整数,分别为从上到下的铁盘的半径R。(1<=R<=100)
输出格式:
一个正整数,表示使铁盘从小到大有序需要的最少翻转次数。
输入输出样例
输入样例#1:
5
2 4 3 5 1
输出样例#1:
5
思路:(手动滑稽!!本题输出n可得30分,(*^__^*) )IDA*的经典。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,ans,flag,a[55]; struct nond { int r,id; }v[55]; int cmp(nond x,nond y){ return x.r<y.r; } int H(){ int bns=0; for(int i=1;i<n;i++) if(abs(a[i]-a[i+1])!=1) bns++; return bns; } void dfs(int k,int g){ int h=H(); if(!h&&a[1]<a[2]){ ans=k; return; } if(h+g>k||ans||g==k) return ; for(int i=2;i<=n;i++) if(abs(a[i]-a[i+1])!=1){ for(int j=1;j<=i/2;j++) swap(a[j],a[i-j+1]); dfs(k,g+1); for(int j=1;j<=i/2;j++) swap(a[j],a[i-j+1]); } } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&v[i].r); v[i].id=i; } sort(v+1,v+1+n,cmp); for(int i=1;i<=n;i++) a[v[i].id]=i; a[0]=-0x7f7f7f7f;a[n+1]=0x7f7f7f7f; for(int k=0;;k++){ dfs(k,0); if(ans){ cout<<ans; break; } } }