题意:
数轴上有 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;
}