POJ 3270 Cow Sorting(置换群)
题意 : N头牛,每个牛的坏脾气都有一个值,每个值都不相同,把这个值按照从小到大排序,如果两个值交换,那么会花掉这两个值之和的时间,让你花最少的时间将每个值从小到大排好序,求最小的总时间。
思路 : 这个在黑书上有写,就是置换群,248页有写。写的挺详细的。每个状态都可以分为若干个循环的乘积。对于任意循环 i ,设其长度为ki,则至少需要交换ki-1次,即每次让一个元素到达目标位置,而当第ki-1个元素到达目标以后显然第ki个也已经到达目标。第一个方法是让循环中最小的元素t参加所有的交换,其他元素值参加一次,总花费为sum+(k-2)t。sum为循环中所有元素的和。
但是这个并不是最优的。
例如初始状态是2 3 1,目标状态是1 2 3,形成的下标数组是3 1 2。
1 2 3
3 1 2
这个置换对应的循环是(1 3 2),只有一个循环节,交换的代价是1+3=4 1+2=3总代价是7
很明显我们是用(1 3 2)这个循环里的最小的数去和其他的数交换,这样能使最后的代价最小,并且一个循环的交换次数是k-1次,k 是这个循环包含的数的个数。
但是这种考虑的方法不一定是最优的,样例中只有一个循环节,若有多个循环节,我们可以用别的循环里的比这个循环里的所有的数小的数来和这个循环里的数来交换,付出的代价不一定比先前那种思路大,所以第二方面我们要考虑把所有数中最小的数与各个循环里最小的数交换,然后与前面那种思路付出的代价比较,取较小的那个。
公式就是ans=sum+∑(从1到n)min{(cnt-2)*t,t+(cnt+1)*m}
//
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm> using namespace std ; struct node
{
int position ;
int level ;
}a[];
bool cmp(node c,node d)
{
return c.level < d.level;
}
int N,minn = ;
int ans ;
bool vis[] ; void solve()
{
memset(vis,false ,sizeof(vis)) ;
ans = ;
int cnt , t , sum ,pos ;
for(int i = ; i < N ; i++)
{
if(!vis[i])
{
vis[i] = true ;
cnt = ;
t = sum = a[i].level ;
pos = a[i].position ;
while(pos != i)
{
sum += a[pos].level ;
vis[pos] = true ;
t = min(t,a[pos].level) ;
pos = a[pos].position ;
cnt ++ ;
}
ans += sum + min((cnt-)*t,t+(cnt+)*minn) ;
}
}
printf("%d\n",ans) ;
}
int main()
{
scanf("%d",&N) ;
for(int i = ; i < N ; i++)
{
a[i].position = i ;
scanf("%d",&a[i].level) ;
minn = min(minn,a[i].level) ;
}
sort(a,a+N,cmp) ;
solve() ;
return ;
}
POJ 3270 Cow Sorting(置换群)的更多相关文章
- POJ 3270 Cow Sorting(置换群)
题目链接 很早之前就看过这题,思路题把,确实挺难想的,黑书248页有讲解. #include <cstdio> #include <cstring> #include < ...
- poj 3270 Cow Sorting
思路:仔细读题,看到FARMER是两两交换牛的顺序进行排序的话,应该就往置换上靠拢,而这个题果然是置换的应用(有的解题报告上说是置换群,其实这只是单个置换,不用让它构成群).我们来将这些无序的牛抽象成 ...
- poj 3270 Cow Sorting (置换入门)
题意:给你一个无序数列,让你两两交换将其排成一个非递减的序列,每次交换的花费交换的两个数之和,问你最小的花费 思路:首先了解一下什么是置换,置换即定义S = {1,...,n}到其自身的一个双射函数f ...
- Cow Sorting(置换群)
Cow Sorting Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6664 Accepted: 2602 Descr ...
- 【POJ】3270.Cow Sorting
题解 用到一点群论的知识! 我们发现把操作写成一个置换后,一定是单个置换圈的内进行操作,把置换圈进行扩大的操作不优 我们有两个办法,一个是用全局最小的换进来,代替这个圈里最小的值,交换操作完成后再换出 ...
- TOJ 1690 Cow Sorting (置换群)
Description Farmer John's N (1 ≤ N ≤ 10,000) cows are lined up to be milked in the evening. Each cow ...
- poj 3270(置换群+贪心)
Cow Sorting Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6993 Accepted: 2754 Descr ...
- HDU Cow Sorting (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1 ...
- BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序
1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 387 Solved: 215[S ...
随机推荐
- void指针
指针有两个属性:指向变量/对象的地址 和长度 但是指针只存储地址,长度则取决于指针的类型 编译器根据指针的类型从指针指向的地址向后寻址 指针类型不同则寻址范围也不同,比如: int*从指定地址向后寻找 ...
- 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
$x_pi = 3.14159265358979324 * 3000.0 / 180.0; //火星坐标系 (GCJ-02)转百度坐标系 (BD-09)算法 function bd_encrypt($ ...
- 关于getpw系列函数返回的静态区域
首先说一下什么是getpw系列函数,它主要是指这些函数: 这些函数根据一个用户名(getpwnam和getpwnam_r两个函数)或者一个用户ID(getpwuid和getpwuid_r)来获取这个用 ...
- ubuntu bash提示找不到文件或目录
我在ubuntu上安装好后交叉编译器,用tab键也可以找到这个交叉编译器,但执行的时候总是提示:bash:xxx找不到文件或目录. 解决方法:安装lib32z1 命令:apt-get install ...
- Factory_Method
class Product { public: virtual ~Product() {} ; }; class ProductA : public Product { public: Product ...
- WinDbg 调试.net程序
WinDbg支持以下三种类型的命令: · 常规命令,用来调试进程 · 点命令,用来控制调试器 · 扩展命令,可以添加叫WinDbg的自定义命令,一般由扩展dl ...
- Golang container/ring闭环数据结构的使用方法
//引入包 import "container/ring" //创建闭环,这里创建10个元素的闭环 r := ring.New(10) //给闭环中的元素附值 for i := 1 ...
- java 高精度
package BigDecimal; import java.math.BigDecimal; import java.lang.Object; public class BigDecimalTes ...
- Color About——First
最近在Android开发学习中遇到TextView背景色以及文字颜色着色问题,在此做个记录. 首先对于颜色的选择,我推荐W3C School,上面有对网页颜色的详尽说明以及实例,还提供了对于,同一种颜 ...
- jdbc连接数据库使用sid和service_name的区别
问题描述: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connect ...