题意:给定n头母牛的脾气大小,然后让你通过交换任意两头母牛的位置使得最后的母牛序列的脾气值从小到大,交换两头母牛的代价是两个脾气之和,使得代价最小。

分析:以前做过一道题,只有一个地方和这道题不同,但是实际意思确是天壤之别,这里是任意两头牛都可以交换,而以前那道题是只能交换相邻的。以前那道题是hdu 2838,

是一道求逆序数的题,树状数组解决之;当我看到这道题时,开始都没注意到这点,以为和以前做的那道题是一样的,后来才发现完全不一样!具体方法就是在数列中找置换环,每个环有两种处理方式,一种是用最小的元素将环里所有元素归位,另一种是用全数列最小元素与环内最小元素交换,并在环内用这个全数列最小元素将环里所有元素归位,再与原环内最小元素交换回来。

代码实现:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; int n,xiao;
struct node{
int x;
int num;
}a[];
int visited[]; int cmp(node a,node b)
{
if(a.x>b.x)
return ;
else
return ;
} int Min(int x,int y)
{
return x<y?x:y;
} void solve()
{
int i,res=,sum,min,temp1,temp2,t,count;
for(i=;i<n;i++)
{
sum=;min=;
t=i;count=;
while(visited[t]==)
{
count++;
if(min>a[t].x)
min=a[t].x;
sum+=a[t].x;
visited[t]=-;
t=a[t].num;
}
if(sum)
res=res+Min(sum-min+(count-)*min,sum+min+(count+)*xiao);
}
printf("%d\n",res);
} int main()
{
int i;
while(scanf("%d",&n)!=EOF)
{
xiao=;
memset(visited,,sizeof(visited));
for(i=;i<n;i++)
{
scanf("%d",&a[i].x);
a[i].num=i;
if(xiao>a[i].x)
xiao=a[i].x;
}
sort(a,a+n,cmp);
solve();
}
return ;
}

poj 3270(置换群)的更多相关文章

  1. poj 3270(置换群+贪心)

    Cow Sorting Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6993   Accepted: 2754 Descr ...

  2. POJ 3270 置换群问题

    题目大意是: 每头牛都有一个对应的值a[i],现在给定一个初始的牛的序列,希望通过两两交换,能够使这些牛按值升序排列,每次交换都会耗费一个 a[i]+a[j] 希望耗费最小,求出这个最小耗费 个人觉得 ...

  3. POJ 3270 Cow Sorting(置换群)

    题目链接 题意 : N头牛,每个牛的坏脾气都有一个值,每个值都不相同,把这个值按照从小到大排序,如果两个值交换,那么会花掉这两个值之和的时间,让你花最少的时间将每个值从小到大排好序,求最小的总时间. ...

  4. POJ 3270 Cow Sorting(置换群)

    题目链接 很早之前就看过这题,思路题把,确实挺难想的,黑书248页有讲解. #include <cstdio> #include <cstring> #include < ...

  5. Cow Sorting POJ 3270 & HDU 2838

    题目网址:http://poj.org/problem?id=3270 题目大意是:一串无序的数字,要排成增序的数列,可以交换不相邻的数,每交换两个数,sum+这两个数,使得sum最小,求最小的sum ...

  6. poj 3270 Cow Sorting

    思路:仔细读题,看到FARMER是两两交换牛的顺序进行排序的话,应该就往置换上靠拢,而这个题果然是置换的应用(有的解题报告上说是置换群,其实这只是单个置换,不用让它构成群).我们来将这些无序的牛抽象成 ...

  7. poj 1026(置换群)

    题意:给你一个变换规则,和一个字符串,问经过k次变换后得到的字符串. 思路:开始的时候试图去找它的整个周期,谁知道周期太大了,各种RE,后来在得知此题需要用置换群来优化,第一次接触置换群学习了下! 代 ...

  8. poj 3270 置换

    poj 置换的应用 黑书原题P248 /** 题意: 给定序列, 将其按升序排列, 每次交换的代价是两个数之和, 问代价最小是多少 思路:1.对于同一个循环节之内的,肯定是最小的与别的交换代价最小 2 ...

  9. poj 3270 更换使用

    1.确定初始和目标状态. 明确.目标状态的排序状态. 2.得出置换群,.比如,数字是8 4 5 3 2 7,目标状态是2 3 4 5 7 8.能写为两个循环:(8 2 7)(4 3 5). 3.观察当 ...

随机推荐

  1. Oracle创建用户并赋予权限

    1 CREATE USER username IDENTIFIED BY password; --这个是创建用户(这是最简单的创建语句没有指定表空间) 1 GRANT CREATE SESSION T ...

  2. 扩展 delphi 线程 使之传递参数.(给匿名线程增加参数)

    新delphi的线程TThread有了CreateAnonymousThread方法,如果再为它加一个可传递的参数不就更好了吗?代码如下: TAnonymousThreadX<T> = c ...

  3. http://blog.csdn.net/sd0902/article/details/8395677

    http://blog.csdn.net/sd0902/article/details/8395677

  4. 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)

    转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...

  5. Intellij IDEA的Hibernate简单应用

    1.创建数据库及其表 create database demo;    use demo; CREATE TABLE `user` (   `id` int(10) unsigned NOT NULL ...

  6. JQuery Selectors 方法说明

    基本选择器 $("#myDiv") 匹配唯一的具有此id值的元素 $("div") 匹配指定名称的所有元素 $(".myClass") 匹配 ...

  7. win7下制作ubuntu系统安装启动盘和U盘安装ubuntu全过程

    在我搞坏了两个系统之后,一切都得从头开始了,这回好了,电脑就是一台裸机了.没办法,重新下win7吧.这个要先做一个win7的启动盘,然后再安装,只能说我技术不行,没能把win7搞定.让大神给装的win ...

  8. 《OD学HBase》20160820

    一.案例 微博: 微博内容: 关注用户和粉丝用户: 添加或移除关注用户 查看关注用户的微博内容 微博数据存储: 响应时间 秒级 无延迟 (1)mysql分布式 (2)hbase数据库 使用HBase数 ...

  9. PDO(PHP Data Object),Mysqli,以及对sql注入等问题的解决

    这篇是上一篇 http://www.cnblogs.com/charlesblc/p/5987951.html 的续集. 看有的文章提到mysqli和PDO都支持多重查询,所以下面的url会造成表数据 ...

  10. HDU 1851 (巴什博奕 SG定理) A Simple Game

    这是由n个巴什博奕的游戏合成的组合游戏. 对于一个有m个石子,每次至多取l个的巴什博奕,这个状态的SG函数值为m % (l + 1). 然后根据SG定理,合成游戏的SG函数就是各个子游戏SG函数值的异 ...