Cow Sorting
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 6750   Accepted: 2633

Description

Farmer John's N (1 ≤ N ≤ 10,000) cows are lined up to be milked in the evening. Each cow has a unique "grumpiness" level in the range 1...100,000. Since grumpy cows are more likely to damage FJ's milking equipment, FJ would like to reorder the cows in line so they are lined up in increasing order of grumpiness. During this process, the places of any two cows (not necessarily adjacent) can be interchanged. Since grumpy cows are harder to move, it takes FJ a total of X+Y units of time to exchange two cows whose grumpiness levels are X and Y.

Please help FJ calculate the minimal time required to reorder the cows.

Input

Line 1: A single integer: N.
Lines
2..N+1: Each line contains a single integer: line i+1 describes
the grumpiness of cow i.

Output

Line 1: A single line with the minimal time required
to reorder the cows in increasing order of grumpiness.

Sample Input

3
2
3
1

Sample Output

7

Hint

2 3 1 : Initial order.
2 1 3 : After interchanging
cows with grumpiness 3 and 1 (time=1+3=4).
1 2 3 : After interchanging cows
with grumpiness 1 and 2 (time=2+1=3).

Source

翻译:
        牛排序
描述
  农民约翰的N(1≤N≤10000)奶牛排队挤奶是在晚上。每头奶牛都有一个独特的“暴躁”的水平范围在1…100000。因为脾气暴躁的奶牛更容易损伤FJ的挤奶设备、FJ想订货的牛线所以他们列队在暴躁的情绪增加的顺序。在这个过程中,任何两个牛的地方(不一定是相邻的)可以互换。因为脾气暴躁的牛很难移动,以福建共计x + y单位时间交换两头牛的暴躁水平X和Y请帮助FJ计算所需的最小时间排序的奶牛。

输入

line1行:一个整数:N
line2行:N + 1:每行包含一个整数:line+ 1描述了牛一、暴躁

输出

line 1:一个需要在暴躁的情绪增加的顺序排列的最小时间行牛。

样例解释

3 1 2:初始订单。
2 1 3:交换后奶牛暴躁3和1(时间= 1 + 3 = 4)。
1 2 3:交换后奶牛暴躁1和2(时间= 2 + 1 = 3)。

解析思路

同:给你一列数,需要将这些数按升序排列。你可以每次交换任意两个数的位置,而一次交换的代价被定义成交换的两个数的和。写一程序,用最小代价来完成这项无聊的排序工作。

提示:本题目的意思为将一组无序数据转化成有序从小到大数列。并且,
每一步只能交换两个数据,每一步付出的代价就是两个数据之和。
题目看似杂乱无章,其实倒有规律可循。
本题目讨论可分成两种情况
例1: 3 5 1 6 7 8 最终要获得是1 3 5 6 7 8
这数列可以分成两个循环链( 3 5 1)(6 7 8)
而交换的最小情况就是每个数都与最小的交换
所以一次循环得到的值为:(t-2)*min+sum;
例2:1 8 6 7,我们很清楚的看到,如果再用例1的方法解决问题是就比较大了
所以我们也可以选择其他循环群的最小值和这里面的数进行交换,最后在换回来
所以一次循环得到的值就是min1+min*(t+1)+sum;

则 最终的式子就是 ans=sum(整个数列的和)+sigma(min((k-2)*mini,(k+1)*min+mini));

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 101000
int a[N],b[N],c[N];
bool d[N];
int n,ans=,mi;
int main(){
//freopen("sh.txt","r",stdin);
mi=0x7f;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",a+i);
b[i]=a[i];
mi=min(mi,a[i]);
c[a[i]]=i;//记录原来数字的下标
}
sort(b,b+n);//调整成正确的队列便于比较
memset(d,,sizeof(d));
while(n){
int sum=,t=,i=,mmm=0x7f;
while(d[i]) i++;
int beg=i;
do{
t++;
d[i]=;
mmm=min(mmm,a[i]);
sum+=a[i];
i=c[b[i]];
}while(i!=beg);
n-=t;
if(t==)continue;
int v1=(t-)*mmm;
int v2=mmm+(t+)*mi;
ans+=min(v1,v2);//累加最小次数
ans+=sum;
}
printf("%d\n",ans);
return ;
}

poj3270的更多相关文章

  1. 【poj3270】 Cow Sorting

    http://poj.org/problem?id=3270 (题目链接) 题意 n个数要要按从小到大的顺序排列,每次只能交换任意两个数,交换的代价为这两个数之和,问最小代价. Solution 题目 ...

  2. 【置换群】poj3270 Cow Sorting

    并不应该叫置换群……只是用到了置换而已,并没有群. 题解看这个吧,我就不写了:http://www.cnblogs.com/kuangbin/archive/2012/09/03/2669013.ht ...

  3. poj3270 Cow Sorting

    给定有序数组a[1...n]的一个置换a[σ(1)...σ(n)], 通过交换数组元素把置换后的数组恢复为有序, 定义进行一次交换的代价为两元素之和,试问此过程的最小总代价. 实际上一种置换即定义S ...

  4. poj3270 && poj 1026(置换问题)

    | 1 2 3 4 5 6 | | 3 6 5 1 4 2 | 在一个置换下,x1->x2,x2->x3,...,xn->x1, 每一个置换都可以唯一的分解为若干个不交的循环 如上面 ...

  5. poj题目

    poj2965 poj1753:标准的BFS+位运算优化 poj1328:线段覆盖变种,把圆对应到线段上,贪心求解 poj2109:高精度开根,二分+高精度,注意要判断答案的位数,如果按照题目给的范围 ...

  6. poj分类 很好很有层次感。

    初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      ( ...

  7. 【转】POJ题目分类推荐 (很好很有层次感)

    OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期: 一. ...

  8. 【转】ACM训练计划

    [转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...

  9. POJ 题目分类(转载)

    Log 2016-3-21 网上找的POJ分类,来源已经不清楚了.百度能百度到一大把.贴一份在博客上,鞭策自己刷题,不能偷懒!! 初期: 一.基本算法: (1)枚举. (poj1753,poj2965 ...

随机推荐

  1. 手动配置 Android SDK

      下载地址与说明http://www.androiddevtools.cn/#sdk-list   手动添加 SDK   这是Android开发所需的sdk,下载并解压后,将解压出的整个文件夹复制或 ...

  2. OC中面向对象2

    一. 定义OC的类和创建OC的对象 接下来就在OC中模拟现实生活中的情况,创建一辆车出来.首先要有一个车子类,然后再利用车子类创建车子对象 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明.类的实现 ...

  3. Bootstrap分页插件--Bootstrap Paginator

    开源中国有一篇介绍的很详细,链接:https://my.oschina.net/shunshun/blog/204587 使用这个插件和使用其他Bootstrap内置的插件一样,需要引入如下文件: & ...

  4. C#八皇后问题 枚举值

    记得刚出道的时候, 有考虑怎么面试, 以及可能会遇到的面试题, 有一个人说了一下 八皇后问题, 据说要用 sql 语句写出来, 暂时我 写了一个C#版本的, 经测验,八皇后算法结果为 92种, 这个与 ...

  5. JavaScript Patterns 4.8 Function Properties - A Memoization Pattern

    Gets a length property containing the number of arguments the function expects: function func(a, b, ...

  6. ORACLE 如何查看索引重建进度情况

    在ORACLE数据库中,如果一个比较大的索引在重建过程中耗费时间比较长,那么怎么查看索引重建耗费的时间,以及完成了多少(比例)了呢,我们可以通过V$SESSION_LONGOPS视图来查看索引重建的时 ...

  7. const,readonly 这些你真的懂吗? 也许会被面试到哦。。。

    首先不可否认,这些在面试上会经常被面试官问起,但是你回答的让面试官满意吗?当然如果你知道了这些原理,或许你就不 怕了.既然说到了原理,我们还是从MSDN说起. 一:值得推敲的几个地方 1.先来看看ms ...

  8. 预写式日志(Write-Ahead Logging (WAL))

    SQL Server中使用了WAL(Write-Ahead Logging)技术来保证事务日志的ACID特性.而且大大减少了IO操作. WAL的核心思想是:在数据写入到数据库之前,先写入到日志.再将日 ...

  9. JSON字符串和Dictionary字典类型的相互转换

    在开发过程中,往往会遇到数据类型转换的情况,根据自己的业务,可能转换类型有多种,下面就说一下json字符串和字典类型的转换. public static class JsonUntity { /// ...

  10. Oracle 安装后关于用户

    一.关于用户 Oracle安装会自动的生产sys用户和system用户: 1. sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户的默认密码是ch ...