题意:
数轴上有n个闭区间[a_i,b_i]。取尽量少的点,使得每个区间内都至少有一个点。输入N个整数(N<=100),之后N行每行两个整数a,b (a,b<=100)。输出选择点的个数。
思路:
贪心:把区间按b从小到大排序(b相同时a从大到小排序)。取第一个区间最右的点,删除包含这个点的区间,然后再取第一个区间最右的点……循环直至所有区间内都至少有一个点。
总结:
一道贪心题目,思考出贪心准则是最关键的。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct qujian
{
int a,b;
qujian(int a1=0,int b1=0)
{
a=a1,b=b1;
}
};
bool cmp(const qujian&q1,const qujian&q2)
{
if(q1.b<q2.b) return true;
else if(q1.b>q2.b) return false;
else
{
if(q1.a>q2.a) return true;
else return false;
}
}
int main()
{
int N;
cin>>N;
vector<qujian> v(N);
for(int i=0;i<N;i++)
{
cin>>v[i].a>>v[i].b;
}
sort(v.begin(),v.end(),cmp);
int ans=0;
while(!v.empty())
{
qujian now=v[0];
v.erase(v.begin());
int thePoint=now.b;
ans++;
//删除包括thePoint点的区间
for(int i=0;i<v.size();i++)
{
if(v[i].a<=thePoint&&v[i].b>=thePoint)
{
v.erase(v.begin()+i);
i--;
}
}
}
cout<<ans<<endl;
}