题意:
N个外星人围成一桌坐下,有序的排列指N在N-1与N+1中间,现在给出一个序列,问至少交换几次可以得到有序的序列。
分析:
复制一遍输入序列,放在原序列之后。相当于环。通过枚举,可以把最小交换次数求出来。正向枚举后,将序列反过来再来一次。
代码:
#include#include #include #include #include using namespace std; int v[1010]; int vis[1010]; int n; int solve(int l,int r) { memset(vis,0,sizeof(vis)); int cnt=0; for(int i=l;i<=r;i++) { if(vis[i]==1) continue; cnt++; int start=i,now=v[i]+l-1; while(now!=start) { vis[now]=1; now=v[now]+l-1; } } return n-cnt; } int main() { while(scanf("%d",&n)&&n) { int i; for(i=0;i