博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】1697: [Usaco2007 Feb]Cow Sorting牛排序
阅读量:6329 次
发布时间:2019-06-22

本文共 728 字,大约阅读时间需要 2 分钟。

【算法】数学置换

【题意】给定n个数,要求通过若干次交换两个数的操作得到排序后的状态,每次交换代价为两数之和,求最小代价。

【题解】

考虑置换的定义:置换就是把n个数做一个全排列。

从原数组到排序数组的映射就是经典的置换,这样的置换一定能分解成循环的乘积。

为什么任意置换都可以这样分解:原数组的每个数要交换到排序位置(有后继),每个数的原位置会有数字来替代(有前驱),故一定构成若干循环节。

循环节内要完成置换,需要按顺序依次替换位置进行len-1次对换(len为循环节长度)。

对于每一循环节内部,最高效的方法就是拿最小的数num来进行len-1次交换,代价为sum-num+(len-1)*num即sum+(len-2)*num。

还有一种方法,是从其它循环节拿一个数字(显然拿全局最小)替换当前循环节最小数完成len-1次对换后再换回去,即sum+(len+1)*min+num。

找到每个循环节然后将两个代价中较小者计入答案。

#include
#include
#include
using namespace std;const int maxn=10010;int a[maxn],n,ms,ans=0;bool vis[maxn];struct cyc{
int num,id;}b[maxn];bool cmp(cyc a,cyc b){
return a.num
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/7570085.html

你可能感兴趣的文章
Linux基础命令---gzip
查看>>
忠告15:山姆。摩尔。沃尔顿:追逐着,并坚持不懈
查看>>
openstack-mikata之网络服务(controller安装部署)
查看>>
我的友情链接
查看>>
通过HAproxy实现动静分离
查看>>
Codeforces Round #256 (Div. 2) D. Multiplication Table 【二分】
查看>>
ARM汇编指令格式
查看>>
HDU-2044-一只小蜜蜂
查看>>
HDU-1394-Minimum Inversion Number
查看>>
jsonView谷歌插件
查看>>
df -h 卡住
查看>>
K-means算法(理论+opencv实现)
查看>>
第七天1
查看>>
[转] createObjectURL方法 实现本地图片预览
查看>>
Jquery中的Jquery.extend, Jquery.fn.extend,Jquery.prototype
查看>>
JavaScript—DOM编程核心.
查看>>
获得表字段名称和数据类型
查看>>
python 日志打印
查看>>
0319-流程控制
查看>>
Javascript鼠标滚轮事件兼容写法
查看>>