1.确定初始和目标状态。

明确。目标状态的排序状态。

2.得出置换群,。比如,数字是8 4 5 3 2 7,目标状态是2 3 4 5 7 8。能写为两个循环:(8 2 7)(4 3 5)。

3.观察当中一个循环,明显地。要使交换代价最小,应该用循环里面最小的数字2。去与另外的两个数字。7与8交换。

这样交换的代价是:

sum - min + (len - 1) * min

化简后为:

sum + (len - 2) * min

当中,sum为这个循环全部数字的和,len为长度,min为这个环里面最小的数字。

4.考虑到第二种情况,我们能够从别的循环里面调一个数字,进入这个循环之中。使交换代价更小。比如初始状态:1 8 9 7 6

可分解为两个循环:(1)(8 6 9 7),明显。第二个循环为(8 6 9 7),最小的数字为6。

我们能够抽调整个数列最小的数字1进入这个循环。使第二个循环变为:(8 1 9 7)。

让这个1完毕任务后,再和6交换。让6又一次回到循环之后。

这样做的代价明显是:

sum + min + (len + 1) * smallest

当中,sum为这个循环全部数字的和。len为长度,min为这个环里面最小的数字,smallest是整个数列最小的数字。

5.因此,对一个循环的排序,其代价是sum - min + (len - 1) * min和sum + min + (len + 1) * smallest之中小的那个数字。但这里两个公式还不知道怎么推出来的。

6.我们在计算循环的时候,不须要记录这个循环的全部元素,仅仅须要记录这个循环的最小的数及其和。

7.在储存数目的时候,我们能够使用一个hash结构。将元素及其位置相应起来,以达到知道元素,能够高速反查元素位置的目的。这样就不必要一个个去搜索。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10010; int a[maxn],b[maxn],dir[100005];
int vis[maxn];
int main()
{
int n;
while(scanf("%d",&n) != EOF){
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
b[i] = a[i];
dir[a[i]] = i;
}
sort(b,b+n);
memset(vis,0,sizeof(vis));
int ans = 0;
for(int i = 0; i < n; i++){
if(!vis[i]){
vis[i] = 1;
int id = i,start = a[i];
int len = 1,min_ = a[i],sum = a[i]; ///找出置换的循环;
while(1){
if(b[id] == start) break;
sum += b[id];
len ++;
min_ = min(min_,b[id]);
id = dir[b[id]];
vis[id] = 1;
} ///求出在当前这个循环中的最小花费;
int tmp = min(min_*(len-1) + sum-min_, b[0]*(len+1) + sum + min_);
ans += tmp;
} }
printf("%d\n",ans);
}
return 0;
}

poj 3270 更换使用的更多相关文章

  1. Cow Sorting POJ 3270 & HDU 2838

    题目网址:http://poj.org/problem?id=3270 题目大意是:一串无序的数字,要排成增序的数列,可以交换不相邻的数,每交换两个数,sum+这两个数,使得sum最小,求最小的sum ...

  2. poj 3270 置换

    poj 置换的应用 黑书原题P248 /** 题意: 给定序列, 将其按升序排列, 每次交换的代价是两个数之和, 问代价最小是多少 思路:1.对于同一个循环节之内的,肯定是最小的与别的交换代价最小 2 ...

  3. POJ 3270 Cow Sorting(置换群)

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

  4. POJ 3270 【组合数学】

    题意: 给长度为N的学列,然后让你通过置换来使其递增.原序列没有相同的数字. 1 ≤ N ≤ 10,000 ai<=100000 思路: 先找到循环,然后根据贪心只有两种比较好的情况,让循环里边 ...

  5. poj 3270(置换群)

    题意:给定n头母牛的脾气大小,然后让你通过交换任意两头母牛的位置使得最后的母牛序列的脾气值从小到大,交换两头母牛的代价是两个脾气之和,使得代价最小. 分析:以前做过一道题,只有一个地方和这道题不同,但 ...

  6. POJ 3270 Cow Sorting(置换群)

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

  7. poj 3270 Cow Sorting

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

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

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

  9. poj 3270(置换群+贪心)

    Cow Sorting Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6993   Accepted: 2754 Descr ...

随机推荐

  1. .bat脚本将windows server 2008设置成ntp时间同步服务器

    @echo off echo autor OAK @echo off echo -------------------------------- @echo off REG ADD HKEY_LOCA ...

  2. Hbiernate关联排序问题

    使用场景: 假设有两张表请求信息.账户表,它们之间是一对多的关系.对应的java类分别为Sfcx_RequestInfo和Sfcx_Zhxx.Sfcx_RequestInfo有一个Set属性 sfcx ...

  3. 基于visual Studio2013解决C语言竞赛题之1015日期计算

        题目 解决代码及点评 /* 15. 已知某年不是闰年,给定该年某一天的月份和日期, 求这一天是该年的第几天. */ #include <stdio.h> #incl ...

  4. VS2008下直接安装使用Boost库1.46.1版本

    Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C++ ...

  5. 页面提交进不了Action的原因

    1.进不了action,页面没有任何js报错,可能的原因是数据类型不一致.例如用ajax方式提交所带的参数类型a是String类型,而action中定义的a是Integer类型就会导致这种情况的发生.

  6. eclipse不能自己主动弹出提示的解决的方法

    曾经碰到过好几次eclipse不能自己主动弹出提示的情况,每次总是弄好之后就不再管它,结果下次遇到同样的问题,又到网上去搜索一大堆答案非常多都不能解决实际问题,费了时间还没有效果,如今这里记录下来下面 ...

  7. 动手学Javascript(1)——PopStar

    PopStar是一款很流行的手机游戏.它的基本规则是在某个方块上单击,如果该方块周围有和它颜色一样的方块,那么这些方块都被选中.之后在选中方块的某一个上再次单击,所有选中的方块就会消失. 如下图所示, ...

  8. 几种经典的数据排序及其Java实现

    选择排序 思想 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: ①初始状态:无序区为R[1..n],有序区为空. ②第1趟排序 在无序区R[1..n]中选出关键字最小的记录R[k ...

  9. GreenDao数据库结构升级

    1.先用GreenDao工具类编写自动创建代码,按照升级后的最新数据库结构来编写 2.GreenDao工具自动生成的代码覆盖到项目里去 3.在项目里找到对应的自动生成的数据库DaoMaster类 在D ...

  10. perl Exporter一些神奇写法

    use base qw(Exporter); @JSON::EXPORT = qw(from_json to_json jsonToObj objToJson encode_json decode_j ...