给定有序数组a[1...n]的一个置换a[σ(1)...σ(n)], 通过交换数组元素把置换后的数组恢复为有序,

定义进行一次交换的代价为两元素之和,试问此过程的最小总代价。

实际上一种置换即定义S = {1,...,n}到其自身的一个双射函数f。

可以证明必然存在整数k使得f^k = f0 = I。即存在周期性。

实际上此函数的幂存在局部周期性,即存在若干个互不相交循环单位,S中每个元素恰属于其中一个循环节。

例如考虑:f:u(1,2,3,4,5,6,7) -> v(3,6,7,5,1,2,4)

将循环单位极小化:(3,7,5,1,4)(6,2)。

循环节内的元素按其在v中的位置排列。

我们的目标是将其调整为(1,3,4,5,7)(2,6)。

循环节内的每一个元素都在不合适的位置上,因此长度为l循环节内部至少需要进行(l - 1)次互换可使其有序。

考虑长度为l的循环节:

由于所有元素均需要调整,因此循环节内部调整代价的一个下界是循环节内所有元素之和加上最小元素与交换次数的乘积。

可以达到该下界:

例考虑调整(3,7,5,1,4),由于1占据了5应该所处的位置,(5,1)交换得到(3,7,1,5,4)。

如此不断迭代将其整理为有序所需代价为min_value * (l - 2) + sum_value(*)。

由于循环节内部调整相互独立,即可以分步进行,考虑利用非循环节内部元素进一步降低代价。

交换循环节外部一元素a(取最小的元素显然更优)和循环节内部一元素b,如此总代价为:

2 * (a + b) + a * (l - 2) + sum_value - b + a = b + a * (l + 1) + sum_value(#),

由于a取外部最小值,b取内部最小值,(#)可能会优于(*)。

(#)-(*) = a * (l + 1) - (l - 3) * b = (l + 1) * (a - b) + 4 * b,

由于已经引入全局最小值,若再次交换则必有a > b,只会增加代价。

因此最多交换一次。

这样本题就可以给出答案了。

http://poj.org/problem?id=3270

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e4 + ;
const int inf = 0x3f3f3f3f;
int f[maxn];
int a[maxn], n, mini;
bool vis[maxn]; void solve(){
memset(vis, , sizeof vis);
int ans = ;
for(int i = ; i < n; i++){
if(vis[i]) continue;
vis[i] = ;
int len = , minii = a[i], sum = a[i];
int j = f[i];
while(j != i){
vis[j] = ;
sum += a[j];
++len;
minii = min(minii, a[j]);
j = f[j];
}
ans += (len - ) * minii + sum + min(, (len + ) * (mini - minii) + * minii);
}
printf("%d\n", ans);
} bool cmp1(int u, int v) { return a[u] < a[v]; } int main(){
freopen("in.txt", "r", stdin);
while(~scanf("%d", &n)){
mini = inf;
for(int i = ; i < n; i++){
scanf("%d", &a[i]);
mini = min(a[i], mini);
}
for(int i = ; i < n; i++) f[i] = i;
sort(f, f + n, cmp1);
solve();
}
return ;
}

poj3270 Cow Sorting的更多相关文章

  1. 【置换群】poj3270 Cow Sorting

    并不应该叫置换群……只是用到了置换而已,并没有群. 题解看这个吧,我就不写了:http://www.cnblogs.com/kuangbin/archive/2012/09/03/2669013.ht ...

  2. HDU Cow Sorting (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1  ...

  3. BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 387  Solved: 215[S ...

  4. Cow Sorting(置换群)

    Cow Sorting Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6664   Accepted: 2602 Descr ...

  5. hdu 2838 Cow Sorting(树状数组)

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. Cow Sorting hdu 2838

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心

    BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行 ...

  8. 树状数组 || 线段树 || Luogu P5200 [USACO19JAN]Sleepy Cow Sorting

    题面:P5200 [USACO19JAN]Sleepy Cow Sorting 题解: 最小操作次数(记为k)即为将序列倒着找第一个P[i]>P[i+1]的下标,然后将序列分成三部分:前缀部分( ...

  9. 【BZOJ 1697】1697: [Usaco2007 Feb]Cow Sorting牛排序

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大 ...

随机推荐

  1. Java基础之读文件——从文件中读取文本(ReadAString)

    控制台程序,使用通道从缓冲区获取数据,读取Java基础之写文件(BufferStateTrace)写入的charData.txt import java.nio.file.*; import java ...

  2. Python:安装mssql模块功能,并实现与sqlserver连接、查询

    由于我系统是x64系统,所以下载python2.7 x64.下载地址:https://www.python.org/downloads/release/python-2712/, 经过测试发现这个版本 ...

  3. IOS Suppot Font 苹果默认支持的字体一览2(普通,加粗,倾斜)

  4. struts2 标签为简单标签

    <s:form method="post" action="" theme="simple"> <s:textfield ...

  5. 【Origin】 碑铭

    快意人生潇洒过, 飘渺岁月不留痕: 他朝墓穴成青冢, 宁不留名念此生. -作于二零一五年六月十日

  6. 【IOS】2.基础

    1.Identifers命名规则 Identifers is combined with letters, underline, dollars, numbers must begin with le ...

  7. char 和 varchar2 区别

    char 与 varchar2 区别 a:char长度固定而varchar2长度可变 b:char的遍历效率要比varchar2的效率稍高 c:char 浪费空间节省时间 varchar2浪费时间节省 ...

  8. 【py技巧】使用reload重导入修改过的包或模块

    #使用import导入 import my_module my_module.something() #out - orignal #这里修改输出 - changed reload(my_module ...

  9. 【linux】暂时解决sis m672(神舟F4000 D9) linux驱动 宽屏分辨率的问题?

    1. 首先安装包 sudo apt-get install gcc make binutils git xorg-dev mesa-common-dev libdrm-dev libtool buil ...

  10. Yii2下拉框实现

    详细介绍yii2下拉框的实现方法,以商品分类的下拉框为例: 第一种方法:使用Html的activeDropDownList(),该方法的优点是:可以自定义下拉框的样式.具体实现如下: 1.控制器中,获 ...