思路:仔细读题,看到FARMER是两两交换牛的顺序进行排序的话,应该就往置换上靠拢,而这个题果然是置换的应用(有的解题报告上说是置换群,其实这只是单个置换,不用让它构成群)。我们来将这些无序的牛抽象成一个置换,一次移动就是对一对元素置换。举个例子:

 

                     

 

                      

 

那么我们用置换环表示应该是(1 6 5)(2 3 4)这样两个3阶环,也就是说这六头牛是两个无序子序列,每个子序列内部按坐标排好序则整体有序,既然要使代价最小,我们就应该让置换的次数尽量少,置换的两个数和尽量小。根据上面的划分,我们知道在一个长度为m的环中至少要移动m-1次使它有序,这样我们就能保证次数最少。那怎样使置换的数尽量小呢?我们知道,所有置换可以拆成对换(2阶环)乘积的形式,不妨将上面的环拆开,(1 6 5)可以拆成(1 6)(1 5),或者(6 5)(6 1),或者(5 1)(5 6),其实这就是3种置换方案。不难发现其中最优的方案是找出环中的极小元素将他分别和环中的其他元素置换一轮,形象点就是从这一波牛中找到那个脾气最小的当媒介,让它换脾气大的牛到相应的位置。貌似这个问题就解决了,我的思路也只是走到了这里。

 

但是这个思路是不完全正确的。如果给出的置换中每个环中的那个极小元素就是置换中的最小元素,那上面的思路肯定正确。但如果最小元素不在这个环里,那存不存在更优的策略?答案是存在的。试试1 8 9 7 6这组数据。将它划分成(8 6 9 7)(1),(没写出下标,直接按权划分的),那么我们把1和6交换,让1加入到前面的环中置换那另外三个大数,最后再把6换出来,发现得到的话费比上面给出的策略更优。也就是说置换的次数最少不一定能得到最优。那除了上面给出的两种策略还有其他的更优策略么?从贪心的角度分析不可能有更优了,所以我们只要对上面的两种策略中选择一个较小的即可。 给出两种方案的计算:

 

第一种策略:sum1=(L1+Min(L))+(L2+Min(L))+...+(Lm-1+Min(L))  其中:sum1为总花费,Li为此环中的牛脾气质数,除去那个极小的一共m-1个,Min(L)为脾气最小的牛。

 

整理一下得到:sum1=sum(L)+(m-2)*Min(L)

 

第二种策略:sum2=(L1+MIN)+(L2+MIN)+...+(Lm-1+MIN)+2*(Min(L)+MIN)  其中MIN为N头牛中脾气最小的

 

整理一下得到:sum2=sum(L)+Min(L)+(m+1)*MIN

 

每个环都按两种策略找到较小累加就是总最小话费。

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<iomanip>
  5. #include<cmath>
  6. #include<cstring>
  7. #include<vector>
  8. #define ll __int64
  9. #define pi acos(-1.0)
  10. using namespace std;
  11. struct change
  12. {
  13. int v;
  14. int n;
  15. bool visit;
  16. }p[];
  17. bool cmp(const change &a,const change &b)
  18. {
  19. return a.v<b.v;
  20. }
  21. int main(){
  22. int n,m,i,j,Min,Max,Mmin,x,y,t,sum,ans2,ans1,ans,num;
  23. while (cin>>n){
  24. for (i=;i<=n;i++){
  25. cin>>p[i].v;
  26. p[i].n=i;
  27. p[i].visit=;
  28. }
  29. sort(p+,p+n+,cmp);
  30. Min = p[].v;Max = p[n].v;
  31. ans = ;
  32. for (i=;i<=n;i++){
  33. Mmin = Max*;
  34. sum = ;
  35. t = i;
  36. num = ;
  37. while (p[t].visit==){
  38. num ++;
  39. sum += p[t].v;
  40. Mmin = min(Mmin,p[t].v);
  41. p[t].visit = ;
  42. t = p[t].n;
  43. }
  44. if (num > ){
  45. ans1 = sum + (num-)*Mmin;
  46. ans2 = sum + Mmin + (num+)*Min;
  47. ans += min(ans1,ans2);
  48. }
  49. }
  50. cout<<ans<<endl;
  51. }
  52. return ;
  53. }

poj 3270 Cow Sorting的更多相关文章

  1. POJ 3270 Cow Sorting(置换群)

    题目链接 很早之前就看过这题,思路题把,确实挺难想的,黑书248页有讲解. #include <cstdio> #include <cstring> #include < ...

  2. POJ 3270 Cow Sorting(置换群)

    题目链接 题意 : N头牛,每个牛的坏脾气都有一个值,每个值都不相同,把这个值按照从小到大排序,如果两个值交换,那么会花掉这两个值之和的时间,让你花最少的时间将每个值从小到大排好序,求最小的总时间. ...

  3. poj 3270 Cow Sorting (置换入门)

    题意:给你一个无序数列,让你两两交换将其排成一个非递减的序列,每次交换的花费交换的两个数之和,问你最小的花费 思路:首先了解一下什么是置换,置换即定义S = {1,...,n}到其自身的一个双射函数f ...

  4. 【POJ】3270.Cow Sorting

    题解 用到一点群论的知识! 我们发现把操作写成一个置换后,一定是单个置换圈的内进行操作,把置换圈进行扩大的操作不优 我们有两个办法,一个是用全局最小的换进来,代替这个圈里最小的值,交换操作完成后再换出 ...

  5. HDU Cow Sorting (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1  ...

  6. BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 387  Solved: 215[S ...

  7. POJ 3045 Cow Acrobats (贪心)

    POJ 3045 Cow Acrobats 这是个贪心的题目,和网上的很多题解略有不同,我的贪心是从最下层开始,每次找到能使该层的牛的风险最小的方案, 记录风险值,上移一层,继续贪心. 最后从遍历每一 ...

  8. Cow Sorting(置换群)

    Cow Sorting Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6664   Accepted: 2602 Descr ...

  9. hdu 2838 Cow Sorting(树状数组)

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

随机推荐

  1. 网站如何提高PR值

    做了站长这些年,积累些经验,记录下来,分享兄弟. 一.商城类型网站 对于商城型的网站站内优化来说,主要是用户咨询和浏览产品时产生的疑问.比如当某用户看到一些自己感兴趣的产品需要咨询的时候,自然就会寻找 ...

  2. 第四届蓝桥杯C/C++A组题目:振兴中华

    首先把题目贴上来吧! 小明参加了学校的趣味运动会,其中的一个项目是:跳格子. 地上画着一些格子,每个格子里写一个字,如下所示:(也可参见图1) 从我做起振 我做起振兴 做起振兴中 起振兴中华 图1 比 ...

  3. C# Winform中DataGridView的DataGridViewCheckBoxColumn使用方法

    下面介绍Winform中DataGridView的DataGridViewCheckBoxColumn使用方法: DataGridViewCheckBoxColumn CheckBox是否选中 在判断 ...

  4. VS2005 VS2008编译的程序在Win7下以管理员身份运行的设置

    在VS2005或者VS2008 里面,直接项目右键---属性---连接器---清单文件---uac执行级别   选择requireAdministrator  重新编译 这样你的程序直接运行就拥有管理 ...

  5. AngularJS(13)-包含

    AngularJS 包含 使用 AngularJS, 你可以使用 ng-include 指令来包含 HTML 内容: 实例 <body> <div class="conta ...

  6. Hbase 0.95.2介绍及下载地址

    HBase是一个分布式的.面向列的开源数据库,该技术来源于Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google文件系统(File System) ...

  7. Delphi XE5教程1:语言概述

    内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...

  8. R简易入门(二)

    本文内容来源:https://www.dataquest.io/mission/128/working-with-data-frames 本文摘要:简单介绍一下用R处理数据   原始数据展示(这是一份 ...

  9. mysql导入的时候提示“1046-No Database selected”的解决办法

    进入phpmyadmin后,先点击左边的要导入的数据库,进入后再点击右上角的“导入‘按钮即可 详细说明 http://www.xmxwl.net/help/member/20160325/13653. ...

  10. Java 图形编程 一:入门

    package second; import java.awt.Color; import java.awt.Frame; import java.awt.event.WindowAdapter; i ...