POJ 3270 Cow Sorting(置换群)

题目链接

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

思路 : 这个在黑书上有写,就是置换群,248页有写。写的挺详细的。每个状态都可以分为若干个循环的乘积。对于任意循环 i
,设其长度为ki,则至少需要交换ki-1次,即每次让一个元素到达目标位置,而当第ki-1个元素到达目标以后显然第ki个也已经到达目标。第一个方法是让循环中最小的元素t参加所有的交换,其他元素值参加一次,总花费为sum+(k-2)t。sum为循环中所有元素的和。

但是这个并不是最优的。

例如初始状态是2 3 1,目标状态是1 2 3,形成的下标数组是3 1 2。

1 2 3

3 1 2

这个置换对应的循环是(1 3 2),只有一个循环节,交换的代价是1+3=4 1+2=3总代价是7

很明显我们是用(1 3
2)这个循环里的最小的数去和其他的数交换,这样能使最后的代价最小,并且一个循环的交换次数是k-1次,k 是这个循环包含的数的个数。

但是这种考虑的方法不一定是最优的,样例中只有一个循环节,若有多个循环节,我们可以用别的循环里的比这个循环里的所有的数小的数来和这个循环里的数来交换,付出的代价不一定比先前那种思路大,所以第二方面我们要考虑把所有数中最小的数与各个循环里最小的数交换,然后与前面那种思路付出的代价比较,取较小的那个。

公式就是ans=sum+∑(从1到n)min{(cnt-2)*t,t+(cnt+1)*m}


 1 //3270
2 #include <stdio.h>
3 #include <string.h>
4 #include <iostream>
5 #include <algorithm>
6
7 using namespace std ;
8
9 struct node
10 {
11 int position ;
12 int level ;
13 }a[11000];
14 bool cmp(node c,node d)
15 {
16 return c.level < d.level;
17 }
18 int N,minn = 99999999 ;
19 int ans ;
20 bool vis[11000] ;
21
22 void solve()
23 {
24 memset(vis,false ,sizeof(vis)) ;
25 ans = 0 ;
26 int cnt , t , sum ,pos ;
27 for(int i = 0 ; i < N ; i++)
28 {
29 if(!vis[i])
30 {
31 vis[i] = true ;
32 cnt = 1 ;
33 t = sum = a[i].level ;
34 pos = a[i].position ;
35 while(pos != i)
36 {
37 sum += a[pos].level ;
38 vis[pos] = true ;
39 t = min(t,a[pos].level) ;
40 pos = a[pos].position ;
41 cnt ++ ;
42 }
43 ans += sum + min((cnt-2)*t,t+(cnt+1)*minn) ;
44 }
45 }
46 printf("%d\n",ans) ;
47 }
48 int main()
49 {
50 scanf("%d",&N) ;
51 for(int i = 0 ; i < N ; i++)
52 {
53 a[i].position = i ;
54 scanf("%d",&a[i].level) ;
55 minn = min(minn,a[i].level) ;
56 }
57 sort(a,a+N,cmp) ;
58 solve() ;
59 return 0 ;
60 }

POJ 3270 Cow Sorting(置换群)

时间: 2025-01-01 21:10:19

POJ 3270 Cow Sorting(置换群)的相关文章

poj 3270 Cow Sorting 置换群 简单题

假设初始状态为 a:2 3 1 5 4 6 则目标状态为 b:1 2 3 4 5 6且下标为初始状态中的3 1 2 4 5 6(a[3],a[1]...) 将置换群写成循环的形式 (2,3,1),(5,4),6就不用移动了. 移动方式2种 1:选循环内最小的数和其他len-1个数交换 2:选整个序列最小的数和循环内最小的数交换,转到1,再换回来. #include<cstdio> #include<queue> #include<algorithm> #include&

poj 3270 Cow Sorting(初涉置换群)

http://poj.org/problem?id=3270 大致题意:给出n个整数,要将它们转化成递增序列,每交换其中两个数的代价是这两个数之和.问排序成功后的最小代价. 该题考察的是置换群知识.在黑书p247上有详细的讲解.总结下置换群,方便复习. 群:给定一个集合G={a,b,c...}和集合G上的二元运算 ·,如果满足封闭性,结合律,存在单位元和逆元,则成集合G在运算'·'之下是一个群. 置换:n个元素1,2,....,n之间的置换可表示为  1     2     3     ...

poj 3270 Cow Sorting

Cow Sorting 题意:有N头牛,每头牛都有不同的暴躁值ai,现在要将所有的牛按照暴躁值从小到大排序,每次交换两个元素(任意交换)时,花费就是两头牛的暴躁值之和:问排序的最小花费为多少? 数据:(1 ≤ N ≤ 10,000) (1 <= ai <= 100,000); 思路:很明显的贪心:(下面讲的循环是置换群里的循环) 策略:我们从没在最终位置且值最小的牛看起,如果每次都是将当前考虑的牛直接与它最终的位置的牛交换,那么这样递推下去,将形成的就是一个循环(一定有牛的最终位置为考虑的起始

POJ 3270 Cow Sorting(置换环)

Cow Sorting Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6393   Accepted: 2476 Description Farmer John's N (1 ≤ N ≤ 10,000) cows are lined up to be milked in the evening. Each cow has a unique "grumpiness" level in the range 1...

[ACM] POJ 3270 Cow Sorting (置换,贪心)

Cow Sorting Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5946   Accepted: 2263 Description Farmer John's N (1 ≤ N ≤ 10,000) cows are lined up to be milked in the evening. Each cow has a unique "grumpiness" level in the range 1...

POJ 3270. Cow Sorting &amp; 51nod 1125 交换机器的最小代价

根据题意,需要交换的部分会形成若干个不相交的环,独立处理每个环. 每个环可以用环内的最小值去和其它元素交换,或者用全局最小值和环上最小值交换,做一遍再交换回去. #include <cstdio> #include <cstring> const int MOD = 9973; int m, n, k; void M(int &a) { if (a >= MOD) a -= MOD; if (a < 0) a += MOD; } struct Mat { int

Cow Sorting(置换群)

Cow Sorting Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6664   Accepted: 2602 Description Farmer John's N (1 ≤ N ≤ 10,000) cows are lined up to be milked in the evening. Each cow has a unique "grumpiness" level in the range 1...

【POJ】3270.Cow Sorting

题解 用到一点群论的知识! 我们发现把操作写成一个置换后,一定是单个置换圈的内进行操作,把置换圈进行扩大的操作不优 我们有两个办法,一个是用全局最小的换进来,代替这个圈里最小的值,交换操作完成后再换出去,二是用圈里最小的换完一圈 就两个操作,计算后贪心即可 代码 #include <iostream> #include <cstdio> #include <vector> #include <set> #include <cstring> #in

【POJ 3270】Cow Sorting(置换群排序)

Cow Sorting(置换群排序) Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6909 Accepted: 2716 Description Farmer John's N (1 ≤ N ≤ 10,000) cows are lined up to be milked in the evening. Each cow has a unique "grumpiness" level in the range 1