POJ 3270 Cow Sorting(置换群问题)

来源:互联网 发布:php 2年工作经验招聘 编辑:程序博客网 时间:2024/06/06 08:46
//离散数学中的置换群问题,找循环节个数。两种情况,1:找循环节中最小值,s-Min+(len-1)*Min。2:用数列中的最小值s+Min+(len+1)*MIN。取最小和#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxm=1e5+10;const int inf=1<<29;int vis[maxm];struct node{    int w,id;    bool operator<(const node &s)const    {        return w<s.w;    }}t[maxm];int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        memset(vis,0,sizeof(vis));        int MIN=inf;        int sum=0;        for(int i=1;i<=n;i++)        {            scanf("%d",&t[i].w);            MIN=min(MIN,t[i].w);            t[i].id=i;        }        sort(t+1,t+n+1);        for(int i=1;i<=n;i++)        {            if(!vis[i])            {                int Min=t[i].w,now=t[i].id,len=1,s=t[i].w;                while(now!=i)                {                    vis[now]=1;                    len++;                    s+=t[now].w;                    Min=min(Min,t[now].w);                    now=t[now].id;                }                 sum+=min(s-Min+(len-1)*Min,s+Min+(len+1)*MIN);            }        }        printf("%d\n",sum);    }    return 0;}

0 0
原创粉丝点击