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课了,转变一下代码风格。

View Code

#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 置换群相关推荐

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

  2. POJ3270 Cow Sorting ——置换群

    我的第一道置换群论题目. 开始的时候不知道这就是置换群,于是对着自己数据各种思考,居然想出来了标准算法的关键部分. 当时的想法是这样的: 从后向前扫描,如果这个数字没有在该在的位置上,那么就用最小的数 ...

  3. bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换)

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 706  Solved: 413 ...

  4. P5200 [USACO19JAN]Sleepy Cow Sorting

    P5200 [USACO19JAN]Sleepy Cow Sorting 题目描述 Farmer John正在尝试将他的N头奶牛(1≤N≤10^5),方便起见编号为1-N,在她们前往牧草地吃早餐之前排 ...

  5. LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组

    \(\mathrm{Sleepy Cow Sorting}\) 问题描述 LG5200 题解 树状数组. 设\(c[i]\)代表\([1,i]\)中归位数. 显然最终的目的是将整个序列排序为一个上升序 ...

  6. poj3270 Cow Sorting 置换环+贪心

    Cow Sorting Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7455   Accepted: 2926 Descr ...

  7. HDU 2838 Cow Sorting(双树状数组+求逆序数)

    Problem Description Sherlock's N (1 ≤ N ≤ 100,000) cows are lined up to be milked in the evening. Ea ...

  8. 奶牛排序 cow sort 置换群

    链接:https://ac.nowcoder.com/acm/contest/924/H 来源:牛客网 题目描述 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便 ...

  9. P5200 [USACO19JAN]Sleepy Cow Sorting 牛客假日团队赛6 D 迷路的牛 (贪心)

    链接:https://ac.nowcoder.com/acm/contest/993/E 来源:牛客网 对牛排序 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

最新文章

  1. 分布式事务之消息补偿解决方案
  2. 【深度学习入门到精通系列】U-net网络分析
  3. Nginx 之五: Nginx服务器的负载均衡、缓存与动静分离功能
  4. [BUUCTF-pwn]——jarvisoj_level1
  5. python参数化建模 书_Python 中如何实现参数化测试?
  6. 【Pytorch神经网络实战案例】01 CIFAR-10数据集:Pytorch使用GPU训练CNN模版-方法①
  7. Kettle报错:Entry to update with following key could not be found
  8. 理解 Android 消息机制
  9. FlashCache初探(一)
  10. 研究员发现 Google Cloud 项目中的 SSRF 漏洞,获1万美元奖金
  11. 清华博士导师整理:Tensorflow和Pytorch的笔记(包含经典项目实战)
  12. 解决MacOS 下载的文件名字乱码问题
  13. C语言汉诺塔问题的递归算法
  14. 噪声报警c语言程序,环境噪声监测器(软件部分).doc
  15. 天刀 服务器状态,12月11日服务器例行维护公告(已完成)
  16. 当db_cache_advice初始化参数设为on, 大大降低了cpu的使用
  17. coursera 吴恩达 -- 第一课 神经网络和深度学习 :第三周课后习题 Key concepts on Deep Neural Networks Quiz, 10 questions
  18. nginx 404 not found错误查找
  19. 最完整实用Android Studio插件整理
  20. 因为有你,我们完成了 Nervos 经济模型第一次共识的凝聚

热门文章

  1. 使用HTML5技术控制电脑或手机上的摄像头
  2. composer 笔记
  3. Windows路由表
  4. 自定义的Android EditText
  5. GDB and core
  6. 无法在 Web 服务器上启动调试。调试失败,因为没有启用集成 Windows 身份验证。请...
  7. 配置文件configSections节点使用实例      。
  8. 深信服上网管理设备恢复出厂设置方法
  9. 2021湖北高考个人成绩排名查询,2021湖北高考总成绩一分一段排名
  10. 支持字典_【多测师小课堂】python数据类型之列表、字典、元祖、字符串