ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

贪心算法: 区间选点

2022-07-12 20:32:06  阅读:162  来源: 互联网

标签:选点 PII min segments 算法 区间 include 贪心


c++

区间选点

/*
	区间选点

题目描述:
	题目搬运:
	给定 N 个闭区间 [ai, bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。
	输出选择的点的最小数量。
	位于区间端点上的点也算作区间内。
	
	输入格式:
	第一行包含整数 N,表示区间数。
	接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。

	输出格式:
	输出一个整数,表示所需的点的最小数量。

	数据范围:
	1 ≤ N ≤ 10^5,
	−10^9 ≤ ai ≤ bi ≤ 10^9

解题思路:
	本题是一个非常典型的贪心问题,关键是如何寻找正确的贪心思路。
	1. 首先,先对区间升序排序,左端点作为第一关键字,右端点作为第二关键字,然后我们思索如何贪心
	2. 数组排序之后,我们需要明确一个目标,在不漏下左边任何一个区间的前提下,将第一个点尽可能的向右
		因为,左面不存在遗漏区间时,点越向右越可能覆盖更多的区间。
		但是如何实现在  不漏下左边任何一个区间的前提下,将选点尽可能的靠右
		在遍历已经排序的区间 segments 时,在当前已选择的 点 point 上更新, min(point, segments[i].right)
		而且当 point > segments[i].left, 说明以后的区间 都不会和 point 有交集了,而且此轮的 Point 也一定不会被更新了,
		因为 segments[i].left <= sigments[i].right
	3. 重复执行 2 操作,直到区间便利完毕。

 */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>

using namespace std;

typedef pair<int, int> PII;

const int N = 100010, _INF = 0xcfcfcfcf, INF = 0x3f3f3f3f;
PII segments[N];
int n;


bool cmp(PII t1, PII t2) {
  	if (t1.first == t2.first) {
    	return t1.second < t2.second;
  	} else {
    	return t1.first < t2.first;
  	}
}


int main()
{
  	// input
  	scanf("%d", &n);
  	for (int i = 1; i <= n; i ++ ) {
    	scanf("%d%d", &segments[i].first, &segments[i].second);
  	}

  	// sort and greedy algorithm
  	int cur_min = _INF;
  	sort(segments + 1, segments + n + 1);

  	int cnt = 0;
  	for (int i = 1; i <= n; i ++ ) {
    	if (cur_min == _INF) {
      	cur_min = segments[i].second;
    	} else if (segments[i].first > cur_min) {
      		cnt += 1;
      		cur_min = segments[i].second;
    	} else {
      		cur_min = min(cur_min, segments[i].second);
    	}
  	}

	// 补上去最后一个
  	cnt += 1;
  
  	printf("%d\n", cnt);
  	return 0;
}




标签:选点,PII,min,segments,算法,区间,include,贪心
来源: https://www.cnblogs.com/lucky-light/p/16471561.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有