poj 3270 置换


 1 poj 3270  置换的应用 黑书原题P248
2 /**
3 题意: 给定序列, 将其按升序排列, 每次交换的代价是两个数之和, 问代价最小是多少
4 思路:1、对于同一个循环节之内的,肯定是最小的与别的交换代价最小
5 2、 对于整个序列中最小的与其交换 ,也可能最小
6 比较这两个大小,即可得出结论
7 对于情况1:代价为 sum+(len-2)*t //len 为每个循环节的长度, t 为每个循环节中最小的那个数 sum 为循环节中所 有数的和
8 对于情况2: 代价: sum+t+(len+1)*min // m为整个序列中最小的数
9 **/
10
11 #include <iostream>
12 #include <cstring>
13 #include <cstdio>
14 using namespace std;
15 int n,Max,Min;
16 const int maxn = 10005;
17 bool vis[maxn];
18 int num[maxn],pos[maxn*10];
19
20 void countSort(){
21 Max = -maxn*10;
22 Min = maxn*10;
23 memset(pos,0,sizeof(pos));
24 for(int i=1;i<=n;i++){
25 pos[num[i]] =1;
26 if(num[i]<Min) Min = num[i];
27 if(num[i]>Max) Max = num[i];
28 }
29 for(int i=1;i<=Max;i++){
30 pos[i] += pos[i-1];
31 }
32 }
33
34 int solve(){
35 int ans =0;
36 memset(vis,0,sizeof(vis));
37 for(int i=1;i<=n;i++){
38 int len =0,temp = i,sum =0,tMin = maxn*10;
39 while(!vis[temp]){
40 vis[temp] = true;
41 len ++;
42 sum += num[temp];
43 if(num[temp]<tMin) tMin = num[temp];
44 temp = pos[num[temp]];
45 }
46 if(len>0){
47 int res1 = sum + (len-2)*tMin,res2 =sum + tMin+ (len+1)*Min;
48 ans += res1<res2?res1:res2;
49 }
50 }
51 return ans;
52 }
53
54 int main()
55 {
56 int i;
57 scanf("%d",&n);
58 for(i=1;i<=n;i++)
59 scanf("%d",&num[i]);
60 countSort();
61 printf("%d\n",solve());
62
63 return 0;
64 }

poj 3270 置换

时间: 2024-11-06 06:35:13

poj 3270 置换的相关文章

poj 3270 置换的运用

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为长度,

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(置换群)

题目链接 题意 : N头牛,每个牛的坏脾气都有一个值,每个值都不相同,把这个值按照从小到大排序,如果两个值交换,那么会花掉这两个值之和的时间,让你花最少的时间将每个值从小到大排好序,求最小的总时间. 思路 : 这个在黑书上有写,就是置换群,248页有写.写的挺详细的.每个状态都可以分为若干个循环的乘积.对于任意循环 i ,设其长度为ki,则至少需要交换ki-1次,即每次让一个元素到达目标位置,而当第ki-1个元素到达目标以后显然第ki个也已经到达目标.第一个方法是让循环中最小的元素t参加所有的交

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&

[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(置换环)

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...

poj 3270(置换群+贪心)

Cow Sorting Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6993   Accepted: 2754 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 更换使用

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为这个环里面

【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