poj   置换的应用 黑书原题P248
/**
题意: 给定序列, 将其按升序排列, 每次交换的代价是两个数之和, 问代价最小是多少
思路:1、对于同一个循环节之内的,肯定是最小的与别的交换代价最小
2、 对于整个序列中最小的与其交换 ,也可能最小
比较这两个大小,即可得出结论
对于情况1:代价为 sum+(len-2)*t //len 为每个循环节的长度, t 为每个循环节中最小的那个数 sum 为循环节中所 有数的和
对于情况2: 代价: sum+t+(len+1)*min // m为整个序列中最小的数
**/ #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n,Max,Min;
const int maxn = ;
bool vis[maxn];
int num[maxn],pos[maxn*]; void countSort(){
Max = -maxn*;
Min = maxn*;
memset(pos,,sizeof(pos));
for(int i=;i<=n;i++){
pos[num[i]] =;
if(num[i]<Min) Min = num[i];
if(num[i]>Max) Max = num[i];
}
for(int i=;i<=Max;i++){
pos[i] += pos[i-];
}
} int solve(){
int ans =;
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++){
int len =,temp = i,sum =,tMin = maxn*;
while(!vis[temp]){
vis[temp] = true;
len ++;
sum += num[temp];
if(num[temp]<tMin) tMin = num[temp];
temp = pos[num[temp]];
}
if(len>){
int res1 = sum + (len-)*tMin,res2 =sum + tMin+ (len+)*Min;
ans += res1<res2?res1:res2;
}
}
return ans;
} int main()
{
int i;
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&num[i]);
countSort();
printf("%d\n",solve()); return ;
}

poj 3270 置换的更多相关文章

  1. poj 3270(置换 循环)

    经典的题目,主要还是考思维,之前在想的时候只想到了在一个循环中,每次都用最小的来交换,结果忽略了一种情况,还可以选所有数中最小的来交换一个循环. Cow Sorting Time Limit: 200 ...

  2. poj 3270 Cow Sorting (置换入门)

    题意:给你一个无序数列,让你两两交换将其排成一个非递减的序列,每次交换的花费交换的两个数之和,问你最小的花费 思路:首先了解一下什么是置换,置换即定义S = {1,...,n}到其自身的一个双射函数f ...

  3. Cow Sorting POJ 3270 & HDU 2838

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

  4. POJ 3270 【组合数学】

    题意: 给长度为N的学列,然后让你通过置换来使其递增.原序列没有相同的数字. 1 ≤ N ≤ 10,000 ai<=100000 思路: 先找到循环,然后根据贪心只有两种比较好的情况,让循环里边 ...

  5. poj 3270(置换群)

    题意:给定n头母牛的脾气大小,然后让你通过交换任意两头母牛的位置使得最后的母牛序列的脾气值从小到大,交换两头母牛的代价是两个脾气之和,使得代价最小. 分析:以前做过一道题,只有一个地方和这道题不同,但 ...

  6. POJ 3270 Cow Sorting(置换群)

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

  7. poj 3270 Cow Sorting

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

  8. poj 3270 更换使用

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

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

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

随机推荐

  1. 说说VS 2015 RC最新开发工具的体验

    有两个我感觉是提高效率的地方: 1.智能提示的改进,鼠标只要移动到代码上面的类型.字段,就会显示相应的提示,这大大提高我们开发时候需要按F12才能看到定义的内容.下面上图,给大家形象化: 2.管理Nu ...

  2. 根据老赵轻量级Actor进行修改的Actor模型

    学习了老赵轻量级Actor模型,并在实际中使用,效果不错. 老赵轻量级Actor模型: ActorLite:一个轻量级Actor模型实现(上) ActorLite:一个轻量级Actor模型实现(中) ...

  3. dp状态压缩-铺砖问题

    题目:有一个n行m列的地板,需要用 1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法? 示范: 解法:用F[i][j]存放第i行的第j状态(j为十进制,转为二进制即是状态)有多少种方案. 用 ...

  4. leetcode 3Sum Closest python

    class Solution(object): def threeSumClosest(self, nums, target): """ :type nums: List ...

  5. C语言——strlen()和sizeof的区别

    strlen()和sizeof()的区别: strlen()——>C字符串库函数,返回字符串的真实长度.它是从内存某位置开始扫描,直到碰到结束符'\0'停止,返回计数器值. sizeof()—— ...

  6. 关于用自带摄像机录像无法捕获uri 问题解决

    这个 我自己调用,好像并没有出现什么问题. 下面是我的代码.你们可以参照一下 File file = new File(Environment.getExternalStorageDirectory( ...

  7. win7_32位安装MySQL_5.6以及密码修改方法

    1.下载mysql: http://www.xiazaiba.com/html/361.html 2.安装 方便起见,全部默认下一步吧,原理一个样,最后安装到: 3.配置环境变量 我这里添加的是  C ...

  8. Oracle EBS-SQL (BOM-7):检查有BOM无工艺路线的子装配件或成品.sql

    select     msi.segment1,     msi.description,     msi.item_typefrom inv.mtl_system_items_b   msiwher ...

  9. 转: ES6异步编程: co函数库的含义与用法

    转: ES6异步编程: co函数库的含义与用法 co 函数库是著名程序员 TJ Holowaychuk 于2013年6月发布的一个小工具,用于 Generator 函数的自动执行. 比如,有一个 Ge ...

  10. outlook 2007如何设置自动转发功能

    "工具" => "规则和通知" => 新建规则 => "邮件到达时检查" => 设置你的条件,比如发件人是谁,主题是 ...