博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序
阅读量:7068 次
发布时间:2019-06-28

本文共 1047 字,大约阅读时间需要 3 分钟。

Description

农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动。因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序。每一头牛的脾气都是一个在1到100,000之间的整数并且没有两头牛的脾气值相同。在排序过程中,JOHN 可以交换任意两头牛的位置。因为脾气大的牛不好移动,JOHN需要X+Y秒来交换脾气值为X和Y的两头牛。 请帮JOHN计算把所有牛排好序的最短时间。

Input

第1行: 一个数, N。

第2~N+1行: 每行一个数,第i+1行是第i头牛的脾气值。

Output

第1行: 一个数,把所有牛排好序的最短时间。

Sample Input

3
2
3
1
输入解释:
队列里有三头牛,脾气分别为 2,3, 1。

Sample Output

7
输出解释:
2 3 1 : 初始序列
2 1 3 : 交换脾气为3和1的牛(时间=1+3=4).
1 2 3 : 交换脾气为1和2的牛(时间=2+1=3).
—————————————————————————————————
将每个点和他的目标点连起来之后我们发现会形成一个个环
那么环内如果自己交换的话 因为每次只能使一个到位 所以至少是环的大小(k)-1次
那么我们用环内的最小值mn去交换必然是最优的
当然也可能是那环外的一个点来换更优 这个时候他要多换入和换出两个操作
计算一下代价求最小就行了
#include
#include
#include
using namespace std;const int M=10007;int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f;}int n,v[M],s[M],vis[M],ans;void mins(int &x,int y){
if(y
View Code

 

转载于:https://www.cnblogs.com/lyzuikeai/p/7461428.html

你可能感兴趣的文章
苹果应用的上线步骤
查看>>
初识scoket
查看>>
Stardew Valley(星露谷物语)Mod开发之路 1环境配置
查看>>
2012 借教室
查看>>
为什么是Spring Boot
查看>>
python基础-协程
查看>>
JavaScript数据类型
查看>>
hdu 2844 混合背包【背包dp】
查看>>
函数分析题
查看>>
debian手册摘要
查看>>
TreeMap 原理
查看>>
iOS开发工具——网络封包分析工具Charles
查看>>
蒙哥玛利模幂算法
查看>>
龙威零式_团队项目例会记录_14
查看>>
YAFFS2文件系统分析(转)
查看>>
获取GET/POST提交的数据,并处理中文问题
查看>>
jdbc 获取connection 对象的三种方式
查看>>
jsp标签+jstl
查看>>
第二阶段个人总结09
查看>>
FATAL ERROR: Could not find ./bin/my_print_defaults的解决办法
查看>>