#include<bits/stdc++.h>
using namespace std;
const int MAXN = 510;
const int INF = 0x3f3f3f3f;
int a[MAXN*2];
int n;
int f(int a[],int n){
bool vis[MAXN]={0};
int c=0;
for(int i=0;i<n;i++) if(!vis[i]){
c++;
for(int x=i;!vis[x];x=a[x]) vis[x]=1;
}
//cout<<c<<endl;
/*这个c相当于几个正确的序列*/
return n-c;
/*n-c就是交换次数*/
/*求最少交换次数,使得1~n排列有序。找出环的数目,答案就是n-环数。eg (13254)可分为(1)、(23)、(54)三个环。*/
/*这个环数才是正解*/
}
int read_case()
{
scanf("%d",&n);
if(!n) return 0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
a[i]--;
}
return 1;
}
void solve(){
int ans=INF;
for(int k=0;k<2;k++) //twice z f
{
for(int i=0;i<n;i++) a[n+i]=a[i];
for(int i=0;i<n;i++) ans=min(ans,f(a+i,n));
reverse(a,a+n);
}
cout<<ans<<endl;
}
int main()
{
while(read_case()){
solve();
}
return 0;
}
UVa120
最新推荐文章于 2020-07-03 17:20:48 发布