zoukankan      html  css  js  c++  java
  • POJ3270 Cow Sorting 置换群

      题目链接:http://poj.org/problem?id=3270

      把数列循环分解,注意到长度为k的循环最少用k-1次置换,那么次循环的最优值就是用循环中的最小值去与每个置换,还要考虑此循环中的最优值可以由其它循环影响,影响的那个循环肯定还有数列中的最小值。

     1 //STATUS:C++_AC_16MS_396KB
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 #include<string.h>
     5 #include<math.h>
     6 #include<iostream>
     7 #include<string>
     8 #include<algorithm>
     9 #include<vector>
    10 #include<queue>
    11 #include<stack>
    12 #include<map>
    13 using namespace std;
    14 #define LL long long
    15 #define pii pair<int,int>
    16 #define Max(a,b) ((a)>(b)?(a):(b))
    17 #define Min(a,b) ((a)<(b)?(a):(b))
    18 #define mem(a,b) memset(a,b,sizeof(a))
    19 #define lson l,mid,rt<<1
    20 #define rson mid+1,r,rt<<1|1
    21 const int N=10010,INF=0x3f3f3f3f,MOD=60007,STA=1000010;
    22 const LL LNF=0x3f3f3f3f3f3f3f3f;
    23 const double DNF=100000000000;
    24 
    25 int num[N],c[N],ma[N*10],vis[N],minu[N],cnt[N],s[N];
    26 int n;
    27 
    28 int main()
    29 {
    30  //   freopen("in.txt","r",stdin);
    31     int i,j,u,ans,k,t,minc;
    32     while(~scanf("%d",&n))
    33     {
    34         ans=k=0;
    35         minc=INF;
    36         mem(vis,0);
    37         for(i=1;i<=n;i++){
    38             scanf("%d",&num[i]);
    39             c[i]=num[i];
    40         }
    41         sort(c+1,c+n+1);
    42         for(i=1;i<=n;i++)
    43             ma[c[i]]=i;
    44 
    45         for(i=1;i<=n;i++){
    46             if(!vis[i]){
    47                 minu[k]=INF;
    48                 cnt[k]=s[k]=0;
    49                 u=i;
    50                 while(!vis[u]){
    51                     vis[u]=1;
    52                     minu[k]=Min(minu[k],c[u]);
    53                     minc=Min(minc,c[u]);
    54                     s[k]+=c[u];
    55                     cnt[k]++;
    56                     u=ma[num[u]];
    57                 }
    58                 s[k]=s[k]+(cnt[k]-2)*minu[k];
    59                 k++;
    60             }
    61         }
    62         for(i=0;i<k;i++){
    63             ans+=Min(s[i],s[i]+2*(minu[i]+minc)-(cnt[i]-1)*(minu[i]-minc));
    64         }
    65 
    66         printf("%d\n",ans);
    67     }
    68     return 0;
    69 }
  • 相关阅读:
    Beego快速入门
    Ubuntu常用配置
    软件过程改进练习题
    将博客搬至CSDN
    【PTA】04-树4 是否同一棵二叉搜索树
    【PTA】03-树1 树的同构
    【转】面试还搞不懂redis,快看看这40道Redis面试题(含答案和思维导图)
    数据挖掘--聚类算法对比
    数据挖掘--模型挖掘之聚类
    数据挖掘--OPTICS
  • 原文地址:https://www.cnblogs.com/zhsl/p/3006566.html
Copyright © 2011-2022 走看看