问题描述:
给定直线上 2n2n2n 个点的序列 P[1,2,…,2n]P[1,2,… ,2n]P[1,2,…,2n],每个点 P[i]P[i]P[i] 要么是白点(用数字 111 表示)要么是黑点(用数字 000 表示),其中共有 nnn 个白点和 nnn 个黑点,相邻两个点之间距离均为 111,请设计一个算法将每个白点与一黑点相连,使得连线的总长度最小。


例如,图中有 444 个白点和 444 个黑点,以图中方式相连,连线总长度为 1+1+1+5=81+1+1+5=81+1+1+5=8。


贪心法:

思路1:
每遇到一个未被连接点,就向后寻找第一个(最近的)不同的点。
这个思路时间复杂度较高、空间复杂度较低。

思路2:
(1)维护一个黑点栈和白点栈;
(2)按顺序遍历每一个点,如果遇到一个白点,就查看当前黑点栈是否为空,非空的话就将将该白点与黑点栈顶黑点连接(因为栈是先入先出,所以栈顶黑点就是离该白点最近的未连接的黑点);遇到黑点也做类似的操作。
这个思路时间复杂度较低、空间复杂度较高。


思路2的C++实现:

//
//  main.cpp
//  ConnectBlackAndWhitePoint
//
//  Created by 胡昱 on 2021/12/31.
//#include <iostream>
#include <stack>
using namespace std;int main(int argc, const char * argv[]) {// 共m组测试数据int m;cin >> m;while((m--) > 0) {// 输入黑白点的数量n,即共有2*n个点int n;cin >> n;// 创建点数组points并输入点int* points = new int[2*n];for(int pi = 0; pi < 2 * n; ++pi) {cin >> points[pi];}// 创建黑白点栈stack<int> whitePoints;stack<int> blackPoints;// 初始化结果int result = 0;// 开始贪心算法for(int pi = 0; pi < 2 * n; ++pi) {// 如果是白色的点if(points[pi] == 0) {// 如果没有黑点待分配,就将这个白点入栈,等一个最近的黑点来挑它if(blackPoints.empty()) {whitePoints.push(pi);}// 如果黑点栈中有未分配的黑点,就选择栈顶元素(也就是最近的黑点)else {result += (pi - blackPoints.top());blackPoints.pop();}}// 如果是黑色的点else {// 如果没有白点待分配,就将这个黑点入栈,等一个最近的白点来挑它if(whitePoints.empty()) {blackPoints.push(pi);}// 如果白点栈中有未分配的白点,就选择栈顶元素(也就是最近的白点)else {result += (pi - whitePoints.top());whitePoints.pop();}}}// 输出结果并释放资源cout << result << endl;delete [] points;}return 0;
}

【贪心法】黑白连线问题相关推荐

  1. K线图|K线图分析法简介 |K线图怎么看

    K线图分析法简介 K线图这种图表源处于日本,被当时日本米市的商人用来记录米市的行情与价格波动,后因其细腻独到的标画方式而被引入到股市及期货市场.目前,这种图表分析法在我国以至整个东南亚地区均尤为流行. ...

  2. C++~回溯+贪心法解决01背包问题

    C++~回溯+贪心法解决01背包问题 参考文章: (1)C++~回溯+贪心法解决01背包问题 (2)https://www.cnblogs.com/rimochiko/p/8168638.html 备 ...

  3. Algorithm:C++语言实现之贪心法算法相关问题

    Algorithm:C++语言实现之贪心法算法相关问题 目录 一.贪心法 一.贪心法 1.LIS的算法分析

  4. java活动安排_贪心法求解活动安排(java实现)

    贪心法描述: 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优 ...

  5. 《挑战程序设计竞赛》2.2 贪心法-其它 POJ3617 3069 3253 2393 1017 3040 1862 3262

    POJ3617 Best Cow Line 题意 给定长度为N的字符串S,要构造一个长度为N的字符串T.起初,T是一个空串,随后反复进行下列任意操作: 从S的头部(或尾部)删除一个字符,加到T的尾部 ...

  6. leetcode 53. 最大子序和 动态规划解法、贪心法以及二分法

    题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子 ...

  7. 贪心法——区间选点问题

    贪心法--区间选点问题 区间选点问题.数轴上有nn个闭区间[ai,bi][a_i, b_i].取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个). 贪心思想:先按bb从小到大进 ...

  8. 贪心法——区间覆盖问题

    贪心法--区间覆盖问题 区间覆盖问题.数轴上有n个闭区间[ai,bi][a_i, b_i],选择尽量少的区间覆盖一条指定线段[s,t][s,t]. 先进行预处理,将不包含[s,t][s,t]的区间都去 ...

  9. 贪心法——选择不相交区间

    贪心法--选择不相交区间 选择不相交区间.数轴上有nn个开区间(ai,bi)(a_i, b_i).选择尽量多个区间,使得这些区间两两没有公共点. 贪心思路:按b<script id=" ...

  10. 贪心法——部分背包问题

    贪心法--部分背包问题 部分背包问题.有nn个物体,第ii个物体的重量为wiw_i,价值为viv_i.在总重量不超过CC的情况下让总价值尽量高.每一个物体都可以只取走一部分,价值和重量按比例计算. 和 ...

最新文章

  1. [HNOI2019]JOJO
  2. AIR720串口2收发数据问题
  3. vector向量容器
  4. caffe模型文件解析_深度学习 Caffe 初始化流程理解(数据流建立)
  5. java班长竞选投票_竞选班长采取投票式,引家长不满,班主任:您说该怎么选?...
  6. php71+yum源+epel,搭建CentOS在线yum源镜像服务器
  7. FFmpeg之yuv裁剪(二十一)
  8. vue(2)学习历程----从iview框架入手
  9. Java基础语法(基本语句)
  10. Photoshop 入门教程,处理图层「2」了解图层基本知识
  11. 伪代码之KMeans和DBSCAN
  12. 20170907wdVBA_ImportPicturesBaseOnExcel
  13. MSDTC不可用解决办法
  14. 中国口岸年鉴(2001-2015年)
  15. java中英文切换,Java实现多语言切换
  16. 网页数据提取----网络投票软件开发
  17. Spring data报错:Inferred type 'S' for type parameter 'S' is not within its bound;
  18. 硬币翻转倍数递增试算
  19. 移动直播之网红主播怎样将直播内容推到斗鱼直播平台的方案
  20. 新增A股热门概念行情—股票数据远程下载服务升级

热门文章

  1. 南方都市报:红心照耀MSN
  2. css动画:多个行星围绕中心恒星旋转
  3. php工程师的学习之道以及需要掌握的知识体系
  4. mysql migration toolkit下载_MySQL Migration Toolkit
  5. 《抡语》 kong子 (收集)
  6. 浏览器页面录制及转视频方案
  7. 初创公司需要哪些部门_哪些初创公司在安全方面犯了错误
  8. 分享Windows Server2003 防木马权限设置IIS服务器安全配置整理 002
  9. 《免费》——比特经济的到来
  10. 不一样的国外广告联盟与cpa赚钱!