和06的书架比,这可是数学的多。
必须使用置换群+离散。
搜一个就是的了。
#include<bits/stdc++.h>
using namespace std;
int a[2001]={0};
int use[2001]={0};
int n,minsum,ji,ou;
int odd(int x){
return x%2;
}
void dfs(int k,int ki,int od,int even){
use[k]=0;
if(use[a[k]]==0){
if(ki==1)
return;
minsum=minsum+ki-1;
if(od&&even)
return;
if(od){
ji++;
}
else{
ou++;
}
}
else{
dfs(a[k],ki+1,od or odd(a[k]),even or(not odd(a[k])));
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
ji=0;
ou=0;
minsum=0;
memset(use,1,sizeof(use));
for(int i=1;i<=n;i++){
if(use[i]){
dfs(i,1,odd(i),1-odd(i));
}
}
if(ji>ou){
minsum=minsum+ji*2;
}
else{
minsum=minsum+ou*2;
}
printf("%d\n",minsum);
}
本文探讨了一种结合离散数学与置换群概念解决特定问题的方法。通过使用C++编程语言实现,介绍了一个具体的算法实例,该算法利用深度优先搜索(DFS)策略来处理一组数据,最终求解出最小化操作数目的方案。
251

被折叠的 条评论
为什么被折叠?



