问题大意:
选择不相交的区间,数轴上有n个开区间(ai,bi),选择尽量多个区间,使得这些区间两两没有公共点。
这道题在紫皮书p232上有详解,大概做法就是按b1<=b2<=b3……排序,选择第一个区间,然后遍历一遍。证明过程自己看书吧。
写的时候重温了一下运算符重载和优先队列。恩 果然学的不怎么样。
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
struct ti
{
int l,r;
};
bool operator> (ti a, ti b)//按从小到大排
{
return a.r > b.r;
}
int main()
{
int m,ans;
while(scanf("%d",&m) != EOF && m)
{
ti one,two;
priority_queue<ti,vector<ti>,greater<ti> > p; //记得空格
ans=1;
for(int i=0; i<m; i++)
{
scanf("%d%d",&one.l,&one.r);
p.push(one);
}
one = p.top();
p.pop();
while(!p.empty())
{
two = p.top();
if(two.l >= one.r)
{
ans++;
one = two;
}
p.pop();
}
printf("%d\n",ans);
}
return 0;
}