题意:
给出一个序列,可以交换两个数字的位置,问最少交换几次,可以使序列有序(升序或者降序,可成环,如2341也算)
思路:
暴力枚举,把每一个数字作为开头,升序;还有每一个数字作为开头,降序,全部算一边;
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 505;
int p[N],k[N],w[N];
int f[N],n;
int solve(int s, int d) {
int cnt = 0;
for(int i = 1; i <= n; i++) {
if(k[i] != s) {
cnt++;
k[w[s]] = k[i];
w[k[i]] = w[s];
k[i] = s;
w[s] = i;
}
s += d;
if(s > n)
s = 1;
if(s <= 0)
s = n;
}
return cnt;
}
int main() {
while(scanf("%d",&n) && n) {
for(int i = 1; i <= n; i++) {
scanf("%d",&p[i]);
f[p[i]] = i;
}
int Min = 0x3f3f3f3f;
for(int i = 1; i <= n; i++) {
memcpy(k, p, sizeof(p));
memcpy(w, f, sizeof(f));
Min = min(Min, solve(i,-1));
memcpy(k, p, sizeof(p));
memcpy(w, f, sizeof(f));
Min = min(Min, solve(i,1));
}
printf("%d\n",Min);
}
}