【程序设计思维与实践 Week3 作业B】区间选点

题意:

数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)

输入:

第一行1个整数N(N<=100)
第2~N+1行,每行两个整数a,b(a,b<=100)

输出:

一个整数,代表选点的数目

样例:

Input

2
1 5
4 6

Output

1

Input

 3
1 3
2 5
4 6

Output

2

思路:

要选择最少的点,使每个区间内都有点。因此,选择的点应尽可能的在多个区间。将所有区间按右端点升序排序,依次选择区间右端点,每次选择完后,将该点所在的区间全部去除,从第一个该点不在的区间开始再次选择,直到所有区间都有点存在。

曾出现的错误:

在对区间排序时,先对区间起点升序,起点相同再对区间终点升序,仍采用上述贪心策略,此时若第一个区间过长导致第二个区间起点虽大于第一个区间,但终点小于第一个区间,此时选的点不在第二个区间而把第二个区间去除导致错误。

代码:

#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
bool cmp(pair<int,int>&a,pair<int,int>&b)
{
	if(a.second!=b.second)
		return a.second<b.second;
	else
		return a.first>=b.first;
}

int main(int argc, char** argv) {
	int n;
	scanf("%d",&n);
	vector<pair<int,int>> a;
	for(int i=0;i<n;i++)
	{
		pair<int,int>temp;
		cin>>temp.first>>temp.second;
		a.push_back(temp);
	}
	sort(a.begin(),a.end(),cmp);
	int count=0;
	vector<pair<int,int>>::iterator it=a.begin();
	while(!a.empty())
	{
		int side=it->second; 
		while(it->first<=side&&!a.empty())
		{
			a.erase(it);
			
		}
		count++;
	}
	cout<<count;
	return 0;
}
发布了25 篇原创文章 · 获赞 8 · 访问量 541

猜你喜欢

转载自blog.csdn.net/weixin_44034698/article/details/104717526