pku 3270 Cow Sorting 置换群
http://poj.org/problem?id=3270
题意:
给定N头牛的身高,要求你通过每次交换两头牛的位置使其按身高从小到大排序,身高各不相同。假设交换ai,aj两头牛的位置则花费的时间为ai + aj,求用最小的时间花费。
思路:
黑书P248详细解释。
cost += sum + Min((k – 2) * ti, ti + (k + 1) * minn);
前一个式子:sum + (k – 2) * ti,ti是所在置换群的最小值
比如:8 4 5 3 2 7
目标 2 3 4 5 7 8,里边有两个置换群(8 2 7)(4 3 5)(这里是每个置换都可以写成若干互不相交的循环的乘积(黑书P247))
第一个置换群里的ti 是2,第二里ti是3
第一个式子:置换群里要使交换代价最小,必然是每次用最小的那个和其余大的交换
最少交换次数是k – 1, 所以除了ti, 其他元素只各参加一次,所以结果是:sum + (k – 2) * ti
第二个式子: 先用ti和所有n中的最小数minn交换,让minn执行交换工作,结束后,再把minn和ti交换回来
总共交换了k + 1次,期中k – 1次是初ti的其他数和minn交换,两次是ti和minn交换
所以结果是:sum + ti + (k + 1) * minn,
比如初始是:1 8 9 7 6
目标是 1 6 7 8 9
分解为(1) (8697),第一种算出来是: 6 + 7 + 8 + 9 + (4 – 2) * 6 = 42
第二种算出来是:6 + 7 + 8 + 9 + 6 + (4 – 1) * 1 = 41 ,
第二种比第一种多交换2次,所以当ti本来就是minn时用第二种会有额外支出,所以二者取小即
总花费cost = sum + ∑min{(ki - 2)*ti,ti + (ki + 1)*m};
ps:这学期开java课了,转变一下代码风格。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <set> #include <map> #include <string>#define CL(a,num) memset((a),(num),sizeof(a)) #define iabs(x) ((x) > 0 ? (x) : -(x)) #define Min(a,b) (a) > (b)? (b):(a) #define Max(a,b) (a) > (b)? (a):(b)#define ll long long #define inf 0x7f7f7f7f #define MOD 100000007 #define lc l,m,rt<<1 #define rc m + 1,r,rt<<1|1 #define pi acos(-1.0) #define test puts("<------------------->") #define maxn 100007 #define M 100007 #define N 10007 using namespace std; //freopen("din.txt","r",stdin);int a[N],b[N],mp[N*100]; bool vt[N*100]; int main(){//freopen("din.txt","r",stdin);int n,i;scanf("%d",&n);int sum = 0,MIN = inf;for (i = 0; i < n; ++i){scanf("%d",&a[i]);sum += a[i];//求总和MIN = Min(a[i],MIN);//求整个序列的最小值b[i] = a[i];}sort(b,b + n);//b目标序列 a与b形成置换CL(vt,false);CL(mp,0);for (i = 0; i < n; ++i){mp[a[i]] = b[i];//置换后建立关系 }for (i = 0; i < n; ++i){int t = a[i];int len = 0;int tMIN = inf;while (!vt[t]){ //找循环//printf("%d ",t);vt[t] = true;len++;tMIN = Min(tMIN,t);t = mp[t];}if (len > 0){sum += Min((len - 2)*tMIN,tMIN + (len + 1)*MIN);}}printf("%d\n",sum);return 0; }
pku 3270 Cow Sorting 置换群相关推荐
- [POJ 3270]Cow Sorting
Description Farmer John's N (1 ≤ N ≤ 10,000) cows are lined up to be milked in the evening. Each cow ...
- POJ3270 Cow Sorting ——置换群
我的第一道置换群论题目. 开始的时候不知道这就是置换群,于是对着自己数据各种思考,居然想出来了标准算法的关键部分. 当时的想法是这样的: 从后向前扫描,如果这个数字没有在该在的位置上,那么就用最小的数 ...
- bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换)
1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 706 Solved: 413 ...
- P5200 [USACO19JAN]Sleepy Cow Sorting
P5200 [USACO19JAN]Sleepy Cow Sorting 题目描述 Farmer John正在尝试将他的N头奶牛(1≤N≤10^5),方便起见编号为1-N,在她们前往牧草地吃早餐之前排 ...
- LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组
\(\mathrm{Sleepy Cow Sorting}\) 问题描述 LG5200 题解 树状数组. 设\(c[i]\)代表\([1,i]\)中归位数. 显然最终的目的是将整个序列排序为一个上升序 ...
- poj3270 Cow Sorting 置换环+贪心
Cow Sorting Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7455 Accepted: 2926 Descr ...
- HDU 2838 Cow Sorting(双树状数组+求逆序数)
Problem Description Sherlock's N (1 ≤ N ≤ 100,000) cows are lined up to be milked in the evening. Ea ...
- 奶牛排序 cow sort 置换群
链接:https://ac.nowcoder.com/acm/contest/924/H 来源:牛客网 题目描述 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便 ...
- P5200 [USACO19JAN]Sleepy Cow Sorting 牛客假日团队赛6 D 迷路的牛 (贪心)
链接:https://ac.nowcoder.com/acm/contest/993/E 来源:牛客网 对牛排序 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...
最新文章
- 分布式事务之消息补偿解决方案
- 【深度学习入门到精通系列】U-net网络分析
- Nginx 之五: Nginx服务器的负载均衡、缓存与动静分离功能
- [BUUCTF-pwn]——jarvisoj_level1
- python参数化建模 书_Python 中如何实现参数化测试?
- 【Pytorch神经网络实战案例】01 CIFAR-10数据集:Pytorch使用GPU训练CNN模版-方法①
- Kettle报错:Entry to update with following key could not be found
- 理解 Android 消息机制
- FlashCache初探(一)
- 研究员发现 Google Cloud 项目中的 SSRF 漏洞,获1万美元奖金
- 清华博士导师整理:Tensorflow和Pytorch的笔记(包含经典项目实战)
- 解决MacOS 下载的文件名字乱码问题
- C语言汉诺塔问题的递归算法
- 噪声报警c语言程序,环境噪声监测器(软件部分).doc
- 天刀 服务器状态,12月11日服务器例行维护公告(已完成)
- 当db_cache_advice初始化参数设为on, 大大降低了cpu的使用
- coursera 吴恩达 -- 第一课 神经网络和深度学习 :第三周课后习题 Key concepts on Deep Neural Networks Quiz, 10 questions
- nginx 404 not found错误查找
- 最完整实用Android Studio插件整理
- 因为有你,我们完成了 Nervos 经济模型第一次共识的凝聚