题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1125

1125 交换机器的最小代价
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题

 收藏
 关注

有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示例
3
3
2
1
Output示例
4

首先  数据量 并不弱, 5w*10^9 因此  必然要用 long long  第一次没

写 过了13组 第二次 成员没用 longlong 过了18组   - .  -

题目大意:   既然是交换顺序;

有两种思路:

在所有的 数据当中,  我们把几个有关联(这几个数交换得到正确位置)的数据放到一起,  组成一个小组,  这样 所有数据, 就分成了 好几个组   ,

然后 我们 在对每一个组扫描的时候, 每次只会影响到当前这个数所在的小组,对其他小组不会造成影响,  因此对于每一个小组

有两种操作实现方式,:

一个是 直接小组内成员交换, 另一个就是,我们借助另外一个特殊值,用特殊值依次实现交换,(这个值是特殊值,为了使重量最小, 所以这个特殊值必须是 全部数据中 最小的那个) 然后 两种方式比较 选择当前小组 中 最合适的方法;

一是  用当前组下 小组内成员进行交换;

二是  借助外力实现, 依次交换;

每次 我们选择 两个中最小的方法 比较  并且要注意;  方法二中; 腾位子的 要多交换两次; for 循环的目的,就是为了解决 多组的问题;

#include <iostream>
#include <queue>
#include <string>
#include <cstring>
#include <cmath>
#include <stdio.h>
#include <algorithm>typedef long long ll;using namespace std;
const int MAXN=50100;
struct mac{ll we;ll col;//位置} a[MAXN];int n;int vis[MAXN];ll pre;
int cmp(mac a,mac b)
{return a.we<b.we;
}
ll change(int i)// 当前状态下最小换的
{ll sum=0;ll x,y,cont=0;x=a[i].we;y=a[i].col;while(i!=y){sum+=a[y].we;vis[y]=1;y=a[y].col;cont++;}sum=sum+min((cont*x),(pre*(cont+2)+x*2));return sum;
}
int main()
{int i,j;while(cin>>n){memset(a,0,sizeof(a));memset(vis,0,sizeof(vis));for(i=1;i<=n;i++){cin>>a[i].we;a[i].col=i;}sort(a+1,a+n+1,cmp);ll sum=0;pre=a[1].we;for(i=1;i<=n;i++){if(!vis[i]){vis[i]=1;sum+=change(i);}}cout<<sum<<endl;}return 0;
}

123

转载于:https://www.cnblogs.com/sizaif/p/9078532.html

51NOD 1125(交换机器最小代价) (贪心) 思想 !思想!相关推荐

  1. 分金问题 返回分割的最小代价 (贪心算法)

    一块金条切成两半,是需要花费和长度数值一样的铜板 比如长度为20的金条,不管怎么切都要花费20个铜板,一群人想整分整块金条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,整块金 ...

  2. 贪心算法-分金问题,返回分割最小代价(java)

    分金问题 分金问题 解题思路 代码演示 递归解法 贪心算法专题 分金问题 一块金条切成两半,是需要花费和长度数值一样的铜板 比如长度为20的金条,不管怎么切都要花费20个铜板,一群人想整分整块金条,怎 ...

  3. SPH算法(求最小代价树)

    一.sph算法简介 1.最小代价树算法 SPH算法也叫做MPH( minimum path heuristic)算法, 用于构造时延约束最算法小代价组播树. 该算法中每 个目的结点通过与当前组播树有最 ...

  4. 贪心算法思想详解+示例代码

    CSDN话题挑战赛第2期 参赛话题:学习笔记 文章目录 五大算法思想 贪心算法 举例说明 选择排序 删除数字 寻找数字最大和 买股票 最大回文字符串 背包问题 小结 五大算法思想 分治思想 贪心算法/ ...

  5. 51nod 1270 数组的最大代价

    1270 数组的最大代价 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 数组A包含N个元素A1, A2......AN.数组B包 ...

  6. 最小代价生成树Prim/Kruskal(c/c++)

    常用的求最小代价生成树的方法有两种:Prim算法和Kruskal算法,这两种算法都是贪心算法的应用, Prim算法 在一个无向带权图中求得最小生成树得思路是:从a顶点出发,将a放入u集合(表示已选), ...

  7. SSL 1460——最小代价问题

    Description 设有一个n×m(小于100)的方格(如图所示),在方格中去掉某些点,方格中的数字代表距离(为小于100的数,如果为0表示去掉的点),试找出一条从A(左上角)到B(右下角)的路径 ...

  8. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Descr ...

  9. 【NOIP2015模拟10.22】最小代价

    Description 给出一幅由n个点m条边构成的无向带权图. 其中有些点是黑点,其他点是白点. 现在每个白点都要与他距离最近的黑点通过最短路连接(如果有很多个黑点,可以选取其中任意一个),我们想要 ...

最新文章

  1. 关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明...
  2. avcodec_receive_packet 11
  3. Js传递数组参数到后台controller的方式
  4. 俄罗斯议会下院通过“老大哥”反恐法
  5. 【机器学习】SVM理论与python实践系列
  6. AGC008D K-th K
  7. 互联网架构:屡试不爽的架构三马车
  8. 信息系统项目管理04——项目整体管理
  9. lambda函数if_Lambda函数用法总结
  10. 单链表尾指针要置为空?为什么单链表建立完以后,比如p指向尾节点,要加上一句p-next=NULL;?
  11. mbedtls | 02 - 伪随机数生成器(ctr_drbg)的配置与使用
  12. clion 产生sigabrt_OpenNERO Ubuntu:进程结束,退出代码134(被信号6:SIGABRT中断)
  13. 简单js模仿浏览器crtl+f功能
  14. 闻与MyBatis之MyBatis快速指南
  15. this.className的使用
  16. 如何更好的思考和学习
  17. [C++STL教程]7.priority_queue优先队列入门学习!零基础都能听懂的教程
  18. 北京星美影院等五家企业因拒收现金被央行警告处罚
  19. 传真故障排除示例--传真CED信号断续导致传真失败
  20. 根据城市名字获取经纬度

热门文章

  1. lr模型和dnn模型_建立ML或DNN模型的技巧
  2. 解构里面再次解构_解构后的咖啡:焙炒,研磨和分层,以获得更浓的意式浓缩咖啡
  3. pytorch机器学习_机器学习— PyTorch
  4. 如何在代码中将menu隐藏_如何在40行代码中将机器学习用于光学/光子学应用
  5. 数据科学与大数据排名思考题_排名前5位的数据科学课程
  6. 如果华为自主的操作系统,对消费者和华为会有什么影响?
  7. Pygame 使用Djkstra广度搜索寻找迷宫(相对)最短路径
  8. linux 命令下删除字符,【Linux基础】tr命令替换和删除字符
  9. python为什么虚部是j不是i_Python基础02 基本数据类型
  10. python参数类型_Python 参数类型和参数匹配模型