51Nod
来源:互联网 发布:pdf电子书资源 知乎 编辑:程序博客网 时间:2024/05/17 05:51
描述
有N台机器重量各不相等,现在要求把这些机器按照重量排序,重量从左到右依次递增。移动机器只能做交换操作,但交换机器要花费一定的费用,费用的大小就是交换机器重量的和。例如:3
2 1,交换1 3后为递增排序,总的交换代价为4。给出N台机器的重量,求将所有机器变为有序的最小代价。(机器的重量均为正整数)
Input
第1行:1个数N,表示机器及房间的数量。(2 <= N <= 50000) 第2 - N + 1行:每行1个数,表示机器的重量Wi。(1
<= Wi <= 10^9)
Output
输出最小代价。
Input示例
3321
Output示例
4
思路
首先再做这一道题之前,最好请做一下最小交换次数,参考我的上一篇博客
使序列有序的最少交换次数(minimum swaps)
我继续转化成图论的方式来理解一下
我们以一组样例来说明:
51 8 9 7 6
首先对这个序列进行排序
我们从元素1开始看,排序后元素1的位置还是1,那么就给1到1之间连一条边,形成一个自环;再到元素8,元素8排序以后到了第4个位置,而第四个位置是元素7,所以给8到7之间连一条有向边,同理连完剩下的边可以得到一张图:
那么我们可以发现两个环,那么我们回到题目中来,要使最后的总和最小,我们的贪心思路是什么?
一:
对于每一个环的贪心思路就是,找到这个环中最小的那个点,也就是6,然后从6开始进行交换,6和9交换,可以使9到对应的位置,花费为6+9=15
,然后6和7交换,花费为6+7=13
,最后等到交换完毕,自最后的答案是什么呢?就是:
剩下一个环不用交换,那么当前的最小值就是42,但是这还不是最优解
二:
我们考虑,在这个图中找到一个最小的值,然后用这个值跟着当前的环进行交换,在这个图中很明显是1,我们让第1和第二个环中的最小值6进行交换,然后再像上面一样,交换1和9,花费为:1+9=10
,交换1和7,花费为:1+7=8
等到交换完毕,最后的结果是:
所以41比42小,显然41更优,所以我们的贪心策略就是在这两者之间,找出一个最小值
参考:51NOD1125交换机器的最小代价(贪心算法)
代码
#include <cstdio>#include <cstring>#include <cctype>#include <stdlib.h>#include <string>#include <map>#include <iostream>#include <stack>#include <cmath>#include <queue>#include <vector>#include <algorithm>using namespace std;typedef long long ll;#define inf 0x3f3f3f3f#define mem(a,b) memset(a,b,sizeof(a))const ll N=50000+20;ll a[N],vis[N];ll least;map<ll,ll>m;ll solve(ll i){ ll j=m[a[i]]; ll minn=a[i]; vis[i]=1; ll x=0,num=a[i]; while(i!=j) { num+=a[j]; minn=min(minn,a[j]); vis[j]=1; x++; j=m[a[j]]; } printf("x=%d,num=%d\n",x,num); return num+min(minn*(x-1),least*(x+2)+minn);}int main(){ mem(vis,0); ll n,x; scanf("%lld",&n); for(ll i=1; i<=n; i++) { scanf("%lld",&a[i]); m[a[i]]=i; } sort(a+1,a+n+1); least=a[1]; ll ans=0; for(ll i=1; i<=n; i++) { if(!vis[i]) { ans+=solve(i); } } printf("%lld\n",ans); return 0;}
- 51Nod
- 51Nod
- 51nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51nod
- 自定义工具错误: 无法生成服务引用的代码 webservice
- FAQ(18):org.apache.ibatis.reflection.ReflectionException: Could not set property 'username' of 'clas
- NOIP 2017 Day1 题2: 时间复杂度 栈
- 渗透学习笔记1【metaspolit通过exe对他人电脑进行操控】
- Mybaties与Hibernate不同
- 51Nod
- Web页面请求过程--计算机网络自顶向下笔记(六)
- numpy基础教程—统计方法
- Saving UI States
- Fragment + viewpager 实现 懒加载 封装
- C++学习笔记-primer_const
- Linux中system函数返回值详解
- ubuntu16下安装mongodb 3.6
- FAQ(19):java.io.FileNotFoundException: class path resource [resources/applicationContext.xml] cannot