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 ...
随机推荐
- score
#include<iostream> using namespace std; class student{ public: int Input() { ;i<;i++) { cou ...
- 【NPOI】.NET EXCEL导入导出开发包
1.导出 //工作簿HSSFWorkbook HSSFWorkbook hssfworkbook = new HSSFWorkbook(); //ISheet页 ISheet sheet1 = hss ...
- 《如何将windows上的软件包或文件上传到linux服务上》
昨天晚上朋友让我帮他简单的搭建个环境,他公司让他做款软件测试温度的,他自己搞的是嵌入式,在公司担任的是软件工程师,应届毕业生.也可能他们搞嵌入式的对这个linux系统不太熟,不会把windows上的软 ...
- 封装鼠标滚轮事件_mousewheel
function mousewheel(obj,fn){ obj.onmousewheel===null ? obj.onmousewheel=fun : obj.addEventListener(' ...
- PHP操作MongoDB简明教程(转)
转自:http://blog.sina.com.cn/s/blog_6324c2380100ux2m.html MongoDB是最近比较流行的NoSQL数据库,网络上关于PHP操作MongoDB的资料 ...
- Laravel 5 基础(四)- Blade 简介
在多个页面中我们可能包含相同的内容,像是文件头,链接的css或者js等.我们可以利用布局文件完成这个功能. 让我们新建一个布局文件,例如 views/layout.blade.php <!doc ...
- 优化C++程序编译效率的一些方法
优化是一件非常重要的事情.作为一个程序设计者,你肯定希望自己的程序既小又快.DOS时代的许多书中都提到,“某某编译器能够生成非常紧凑的代码”,换言之,编译器会为你把代码尽可能地缩减,如果你能够正确地使 ...
- IE下同样的$.ajax()被调用两次,只能执行一次(第一次)
今天发现了这个问题,仅限于IE下所有浏览器包括Edge 百度了一下原来问题就在这句话:如果第二次请求与第一次请求完全相同,会直接从缓存获取. 那么就在请求时让URL变得不一样吧 $.ajax({ ty ...
- ESB概述
ESB概念的提出: 企业有大量的异构的业务系统,这些系统之间需要通过web service来交互数据,这样的话可以想象系统直接的交互关系是蜘蛛网状的,是难以维护的.这时候提出了ESB,每个业务系统只需 ...
- Linux nmon 监控工具使用
Linux 系统下监控指标及指标查看 一.工具介绍 Linux 系统下资源监控使用nmon 工具.它可以帮助在一个屏幕上显示所有重要的性能优化信息,并动态地对其进行更新且并不会消耗大量的CPU ...