ALDS1_6_D:Minimum Cost Sort (置换群)同POJ 3270

链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_6_D

一个数组构成许多小的闭环(循环链)每个闭环中各个元素交换到自己的位置有两种方法;

1,找当前闭环中的最小值,一直换就好,设闭环中有n个元素,每个元素的价值为wi则交换的代价为(∑wi-min(w1)+(n-1)*min(wi));

2,引入一个值x(x是数组之中的最小值),把x换入之后再换出去,此时交换的代价为(∑wi+n*x+min(wi)+x)

两者取最小即为所求的答案:

代码:

 

#include 
#include 
#include 
using namespace std;
#define maxn 10010
 
int c[maxn];
 
int main()
{
    int n,ans=0,x=0;
    int a[1010],b[1010];
    bool vis[1010];
    cin>>n;
    for(int i=0; i>a[i];
        b[i]=a[i];
        vis[i]=false;
        x=min(x,a[i]); 
    }
    sort(b,b+n);
    for(int i=0; i

 

你可能感兴趣的:(ALDS1_6_D:Minimum Cost Sort (置换群)同POJ 3270)