POJ3270 cow sorting 【polya】

题目描述:

给你一个数字序列(每个数字唯一),每次你可以交换任意两个数字,代价为这两个数字的和,问最少用多少代价能把这个序列按升序排列好。

题目的具体做法是参考刘汝佳的《算法艺术与信息学奥赛》大概思路是:以后再用别种方法解,

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 76

可分解为两个循环:(1)(8 6 9 7),明显,第二个循环为(8 6 97),最小的数字为6。我们可以抽调整个数列最小的数字1进入这个循环。使第二个循环变为:(8 1 97)。让这个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 <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int seq[11111];
int to[11111];
int indexn[1111100];
bool vis[1111100];
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&seq[i]);
            indexn[seq[i]]=i;
            to[i]=seq[i];
        }
        sort(to+1,to+1+n);
        int res=0;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                int start=seq[i];

                int minn=9999999;int len=0;int sum=0;int now=i;
                do
                {
                    vis[now]=true;
                    sum+=seq[now];
                    len++;
                    minn=min(minn,seq[now]);
                    if(to[now]==start)
                        break;
                    now=indexn[to[now]];
                }while(true);
                int sum1=sum-minn+(len-1)*minn;
                int sum2=sum+minn+(len+1)*to[1];
                res+=min(sum1,sum2);
            }
        }
        cout<<res<<endl;
	}
	return 0;
}

POJ3270 cow sorting 【polya】

时间: 2024-10-24 04:08:11

POJ3270 cow sorting 【polya】的相关文章

POJ1026 Cipher 【polya】

This question is not so difficult. First,my thoughts were we should use a lot of code to find out the loop block,but there is no need to do that . you just need to get every new position of char in the string. Algorithm is also easy , just like how d

HDU2838 Cow Sorting【树状数组】【逆序数】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2838 题目大意: 有N头奶牛排成一排.每头奶牛都有一个唯一的"坏脾气"值.坏脾气的范围为1~100000.现在将 奶牛重新排序,使奶牛按照坏脾气增加的顺序排列.所有的奶牛都可以相互交换位置.但是交换脾 气值为X,Y的两头奶牛,需要的时间是X+Y.现在问:将奶牛重新排列需要的最短时间是多少. 思路: 这道题就是给你一个N个元素的序列,求这个序列中所有逆序数的和.所以,对于值为a的第i个元素

POJ 2154 【POLYA】【欧拉】

前记: TM终于决定以后干啥了.这几天睡的有点多.困饿交加之间喝了好多水.可能是灌脑了. 切记两件事: 1.安心当单身狗 2.顺心码代码 题意: 给你N种颜色的珠子,串一串长度问N的项链,要求旋转之后重合的算是同一种项链.问一共有多少中可能.结果模p. 1 <= N <= 1000000000, 1 <= P <= 30000 思路: 首先是我们的POLYA定理,给定的公式是这样的sigma(N^gcd(N,i))/N   i从0到N-1. 然后是优化的问题.因为如果我们枚举i累加

Hdoj 5195 DZY Loves Topological Sorting 【拓扑】+【线段树】

DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 922 Accepted Submission(s): 269 Problem Description A topological sort or topological ordering of a directed graph i

POJ3615 Cow Hurdles【Floyd】

Cow Hurdles Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6155 Accepted: 2760 Description Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the gang are practicing jumping over hurdles. They are gett

WebGrid with filtering, paging and sorting 【转】

WebGrid with filtering, paging and sorting by Jose M. Aguilar on April 24, 2012 in Web Development A few days ago I received some questions on the use of the Webgrid helper in the comments section of my personal blog, specifically on how to implement

ASP.NET MVC WebGrid &ndash; Performing true AJAX pagination and sorting 【转】

ASP.NET MVC WebGrid – Performing true AJAX pagination and sorting FEBRUARY 27, 2012 14 COMMENTS WebGrid is a very powerful HTML helper component introduced with ASP.NET MVC 3 and ASP.NET Web Pages. Despite all its cool features, it is troublesome to

POJ 1286 【POLYA】

题意: 给你三种颜色的珠子,每次给你N,问在旋转,翻转之后视作相同的情况下,能组成多少种不同的项链. 思路: 让我们借这道题拯救一下我对POLYA定理的理解... sigma(m^(gcd(i,n))) 以上是在旋转的时候计数的和,其中m是颜色的数量,n是项链的长度. 一下考虑翻转的情况: 当n是偶数的时候, 有n/2种情况循环节的数量是n/2+1,有n/2种情况是n/2. 当n是奇数的时候, 有n种情况是循环节的数量是n/2+1 别忘了最后要除以循环节总的种类数!!! 坑点: 这题n可能等于0

POJ3268 Silver Cow Party 【Dijkstra】

Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13183   Accepted: 5932 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X