天天看點

cow sorting

#include<stdio.h>

#include<iostream>

#include<algorithm>

#include<string.h>

using namespace std;

int cow[10010],acow[10010];//目标狀态存在acow中

int hash[100010];//存儲每隻牛的下标

bool vis[10010];//找過的牛置為1

int main()

{

 int n,i,sum,qmin,bmin;

 while(scanf("%d",&n)!=EOF)

 {

  qmin=1<<25;

  memset(vis,false,sizeof(vis));

  sum=0;

  for(i=0;i<n;i++)

  {

   scanf("%d",&cow[i]);

   acow[i]=cow[i];

   hash[cow[i]]=i;

   sum=sum+cow[i];

   if(cow[i]<qmin) qmin=cow[i];

  }

  sort(acow,acow+n);

  int lehn=n,ans=0,leh;

  while(lehn)

  {

   i=leh=0;

   bmin=1<<25;

   while(vis[i]) i++;//找到輪換的起點

            int begin=i;//記錄起點,便于判斷是不是已經循環完了

   while(1)

   {

                 leh++;

     vis[i]=1;

     if(cow[i]<bmin) bmin=cow[i];

     i=hash[acow[i]];

     if(i==begin) break;

   }

             lehn-=leh;//長度減去輪換的長度,等于剩下的所有長度

     // if(leh==1) continue;//隻有一個元素的循環不需要變動

   int V1=(leh-2)*bmin;

   int V2=(leh+1)*qmin+bmin;

   ans+=V1<V2?V1:V2;

  }

  printf("%d\n",ans+sum);

 }

 return 0;

}