排序的代价
来源:互联网 发布:淘宝网小蚊子店铺 编辑:程序博客网 时间:2024/05/16 04:26
排序的代价
- 查看
- 提交
- 统计
- 提问
- 总时间限制:
- 10000ms
- 单个测试点时间限制:
- 5000ms
- 内存限制:
- 65536kB
- 描述
现有一排装满货物的箱子,重量各不相同(都已标示在箱子上),为了进行后面的工作,需要将这些箱子按轻重有序放置,但只有一名工作人员来完成这项工作,由于空间有限,他只能通过不断交换两个箱子(可不相邻)的位置的方式来实现箱子的排序。他知道这样一定可以完成任务,但搬箱子很累,所以他希望找到一种最省力的方式来完成工作,假设一次交换两个箱子的代价为这两个箱子的重量之和,那么这项工作的总代价为此过程中所有“交换”的代价之和,请帮助他计算排列这些箱子的最小代价。
- 输入
- 输入包含多个数据实例,每个实例独占一行,每行数据是以空格分隔的非负整数,其中第一个整数表示箱子的个数(n),接下来为n个不同的正整数,分别表示n个箱子的重量,其顺序表示了箱子的初始顺序;当n=0时表示输入结束。
- 输出
- 对每个有效数据实例(n!=0)都输出一个整数,独占一行,表示该实例中排序箱子的最小代价。
- 样例输入
3 3 2 14 8 1 2 45 1 8 9 7 66 8 4 5 3 2 70
- 样例输出
4174134
- 提示
- 示例解释:
共有4个有效数据实例:
第一个数据实例为3 2 1,通过交换重为3和1的箱子即可,总代价为3+1=4;
第二个数据实例为8 1 2 4,代价最小的交换过程为
1↔2,1↔4,1↔8,总代价为(1+2)+(1+4)+(1+8) = 17;
第三个数据实例为1 8 9 7 6,代价最小的交换过程为
1↔6,1↔9,1↔7,1↔8,1↔6,总代价为(1+6)+(1+9)+(1+7)+(1+8)+(1+6)=41;
第四个数据实例为8 4 5 3 2 7,代价最小的交换过程为
3↔5,3↔4,2↔7,2↔8,总代价为(3+5)+(3+4)+(2+7)+(2+8)=34。
请注意边界条件和IO,n可能很大。 - 交换过程可以分解成不相交的环形,不同环形之间互不影响。对每一个环,要使排序代价最小,要么找这个环的最小元素开始沿着这个环交换一圈或者先把这个环的最小元素和所有元素中的最小元素交换,让所有元素中的最小元素沿着这个环交换一圈,之后再换回去。
#include<iostream>#include<cmath>#include<cstring>#include<algorithm>#include<iomanip>#include<queue>#include<stack>#include<vector>#include<set>#include<map>using namespace std;const int Max_N=1000005;int n;struct data{int index;int value;}a[Max_N];int father[Max_N];//记录转换位置 int Pre[Max_N];//记录排序前值 bool Vis[Max_N];bool cmp(data&m,data&n){return m.value<n.value;}int main(){while(scanf("%d",&n)&&n){int Min=0x7fffffff/2;for(int i=0;i<n;++i){scanf("%d",&a[i].value);a[i].index=i;Pre[i]=a[i].value;Min=min(Min,a[i].value);}sort(a,a+n,cmp);for(int i=0;i<n;++i){father[a[i].index]=i;}memset(Vis,0,sizeof(Vis));int Sum=0;for(int i=0;i<n;++i){if(Vis[i])continue;Vis[i]=true;if(father[i]==i)continue;Sum+=Pre[i];int num=1;int tmp=father[i],tmpmin=Pre[i];while(tmp!=i)//找环 {Vis[tmp]=true;Sum+=Pre[tmp];num++;tmpmin=min(tmpmin,Pre[tmp]);tmp=father[tmp];}if(tmpmin*(num-1)<2*(tmpmin+Min)+(num-1)*Min){Sum+=(tmpmin*(num-2));}else{Sum+=(tmpmin+2*Min)+(num-1)*Min;}}printf("%d\n",Sum);}return 0;}
阅读全文
0 0
- 统计排序的代价
- codevs2845 排序的代价
- 排序的代价
- CODEVS 2845 排序的代价
- wikioi2845 排序的代价 Polay定理
- 最快的排序方法,以空间耗费为代价!!
- 三无的代价
- 成熟的代价
- 游泳的代价
- 一套房子的代价
- 成长的代价
- 一套房子的代价
- 辛苦一生的代价
- 爱的代价 - 张艾嘉
- 爱的代价
- 软件集成的代价
- 成长的代价~~
- 爱的代价
- RobotFrameWork(十三)RobotFramework与loadrunner性能测试结合(基于Remote库)
- 作业2
- extends与implements的区别
- 因为互相联系,所以系统诊治
- 主存到Cache直接映射、全相联映射和组相联映射
- 排序的代价
- gnuplot画出不同的类
- javascript常见语句总结
- C语言 快速排序函数
- 使用gradle创建Akka项目
- hdu6197最长增长序列 二分法
- 线性回归多重共线性优化
- 作业3
- Android-Fragment源码解析