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. BZOJ 1264: [AHOI2006]基因匹配Match( LCS )

    序列最大长度2w * 5 = 10w, O(n²)的LCS会T.. LCS 只有当a[i] == b[j]时, 才能更新答案, 我们可以记录n个数在第一个序列中出现的5个位置, 然后从左往右扫第二个序 ...

  2. 1941. Scary Martian Word

    1941. Scary Martian Word 这道题 一个长度为3的字符串视为 一个 火星文 字母(ASCII 33-122) ,给出一个火星人认为恐怖的单词(由火星字母组成) 然后 给你一篇文章 ...

  3. HDU 1599 find the mincost route (无向图floyd最小环详解)

    转载请注明出处:http://blog.csdn.net/a1dark 分析:终于弄懂了floyd的原理.以前的理解一直肤浅.所以一做到floyd应用的题.就拙计了.其实floyd的本质DP.利用前K ...

  4. SilkTest Q&A 13

    Q121 :我想要测试 windows2003 上的 remote 应用,但是每次都得到如下的错误 我想要测试 windows2003 上的 remote 应用,但是每次都得到如下的错误: " ...

  5. 好消息:8月25日广州嵌入式Linux开发免费项目约定你

    8月18日,粤嵌深圳分校举行了盛大的免费嵌入式项目体验,众多嵌入式爱好者排队参加项目体验的火爆场景仿佛还在眼前,体验效果得到学员一致好评.时隔一周,粤嵌广州总部也不容落后,在粤嵌广州总部举办<嵌 ...

  6. 调用ShellExecute所须要头文件

    调用ShellExecute所须要头文件 #include   "windows.h " #include   "shellapi.h "

  7. U盘只剩下快捷方式

    原理: 其实,这个是一种叫1KB病毒(也称之为快捷方式病毒.风暴一号)惹的祸,它是一种恶意的蠕虫病毒,执行以下恶意操作:1.当你的U盘放到一个已经被感染 的主机上时,主机(我的电脑)上的病毒体进程首先 ...

  8. WCF随笔3----消息编码器

    原文:WCF随笔3----消息编码器 我们都知道,message是wcf通信框架进行通信的最基本的单位,但是wcf开发人员其实根本不需要直接与message打交道,一样能够写好wcf相关的程序.这是因 ...

  9. SRM 583 Div II Level Three:GameOnABoard,Dijkstra最短路径算法

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12556 用Dijkstra实现,之前用Floyd算法写了一个, ...

  10. Swift - 使用Auto Layout和Size Classes实现页面自适应弹性布局

    在过去只有iphone4的时候,可以在代码里将一个可视单元的位置写死,这样是没问题的,但随着iPhone5,6的发布,屏幕尺寸有了越来越多种可能.这就要求App的UI控件具有在不同屏幕尺寸的设备上具有 ...