hdoj 3270 置换群

来源:互联网 发布:prisma tensorflow 编辑:程序博客网 时间:2024/05/29 08:52

题意:

     给一个无序数组,通过一系列对换使之有序。对换的花费是对换两个数的和。问达到目标的最小花费。

思路; 有两种操作:一是可以拿置换中的每一个元素和置换中最小元素依次对换;还可以拿置换中最小元素和序列中最小元素做一次置换,再进行第一种操作。

#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;int main(){    int n;    scanf("%d",&n);    vector<pair<int,int> >cows;    for(int i=0;i<n;i++)    {        int x;        scanf("%d",&x);        cows.push_back(make_pair(x,i));    }    sort(cows.begin(),cows.end());    int ans=0,m=cows[0].first;    for(int i=0;i<n;i++)    {        if(cows[i].second==-1)            continue;        int j=cows[i].second,w=cows[i].first,k=1;        cows[i].second=-1;        while(i!=j)//找到一个循环        {            k++;            ans+=cows[j].first;            int t=cows[j].second;            cows[j].second=-1;            j=t;        }        ans+=min((k-1)*w,(k-1)*m+2*(m+w));    }    printf("%d\n",ans);    return 0;}


0 0
原创粉丝点击