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为这个环里面最小的数字。

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;
}
时间: 2024-08-15 07:44:29

poj 3270 更换使用的相关文章

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

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

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+

poj 3270 Cow Sorting

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

POJ 3270 置换群问题

题目大意是: 每头牛都有一个对应的值a[i],现在给定一个初始的牛的序列,希望通过两两交换,能够使这些牛按值升序排列,每次交换都会耗费一个 a[i]+a[j] 希望耗费最小,求出这个最小耗费 个人觉得这道题还是蛮有意思的,虽然我wa了很多发,但还是很值得思考一下的 这是一个置换群问题,但是我们首先要根据其值排个序确定每头牛本来应该属于的位置,再根据现在所在的位置得到一个映射关系to[i] 将a[i]又用b[]数组保存,排序后,b[i]表示第i大的牛的值 我们找出这个置换群中的所有循环集,每个循环

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

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