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. iOS 开发之路(登陆验证调用WebService)二

    swift3.0下使用Alamofire调用Webservice遇到的一些问题以及解决方案. 首先是针对没有证书的https下的接口处理问题(ps:不推荐在正式版本中使用),manager.reque ...

  2. 关于插件管理器Alcatraz

    如何安装插件管理器Alcatraz:去github下载一个Alcatraz安装包,然后运行一下. 会弹出 记得选择左边的Load Bundle 退出Xcode 重新运行一下就OK 了. 然后就可以看到 ...

  3. ios 图片的两种加载方式

    控件加载图片,plist,懒加载,序列帧动画,添加动画效果. IOS中有2种加载图片的方式. 方式一:有缓存(图片所占用的内存会一直停留在程序中) + (UIImage *)imageNamed:(N ...

  4. UISegmentedControl(人物简介)

    效果图 当你点击上面人物名字的时候 ,就可以随意切换人物. 这个很有趣 , 你还可以试着添加音乐播放器 .以及一些别的来完善你想做的. 好吧 , 废话不多说 , 上代码. #import " ...

  5. Android源码笔记——Camera系统架构

    Camera的架构与Android系统的整体架构保持一致,如下图所示,本文主要从以下四个方面对其进行说明. Framework:Camera.java Android Runtime:android_ ...

  6. fir终端打包,亲测可用

    1.注册fir.拿到token 2.安装 fir-cli 使用 Ruby 构建, 无需编译, 只要安装相应 gem 即可. $ ruby -v # > 1.9.3 $ gem install f ...

  7. php 操作mysql 分表的一种方法

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAARUAAAHXCAIAAAAdrFkKAAAgAElEQVR4nOyd61sTx9//+4fcj+6H95

  8. Java并发工具类Semaphore应用实例

    package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Semaph ...

  9. Java并发之Condition 并发同步控制

    package com.thread.test.thread; import java.util.PriorityQueue; import java.util.concurrent.locks.Co ...

  10. 今天说一下DML触发器的顺序

    因为05之后的版本允许了一个对象有多个after触发器,所以呢~顺序方面还是要留意一下下的.比如我现在要往一个测试表里面添加多个触发器. USE Test GO ,),Name )) GO CREAT ...