转至
http://www.cnblogs.com/celia01/archive/2012/01/26/2329687.html
struct point{
node a, b;
}p[N];
1、选择不相交区间
【例1】数轴上有n个开区间(ai,bi)。选择尽量多个区间,使得这些区间两两没有公共点。
【Solution】
bool cmp(point x, point y){
if(x.a!=y.a)
return x.b<y.b;
else
return x.a>y.a;
}
sort(p,p+n,cmp);
再一次选区间
2、区间选点问题
【例2】数轴上有n个闭区间[ai,bi]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。
【Solution】排序方式通【例1】,选点时选未覆盖点的区间的右端点。
3、区间覆盖问题
【例3】数轴上有n个闭区间[ai,bi]。选择尽量少的区间覆盖一条指定线段[s,t]。
【Solution】首先进行预处理,在[s,t]外部的线段全部除去。
不断用已选择的区间右端点bi更新要覆盖线段的起点,知道已知线段被全部覆盖。
- #include <iostream>
- #include <algorithm>
- using namespace std;
- struct XML
- {
- int _strat_vale,_end_vlaue;
- bool operator<(const XML&x) const
- {
- return _end_vlaue<x._end_vlaue;
- }
- }xml[40001];
- int main()
- {
- int n,i,a,b,res,s;
- while(cin>>n)
- {
- for(i=1;i<=n;i++)
- {
- scanf("%d%d",&a,&b);
- if(a>b)
- a^=b,b^=a,a^=b;
- xml[i]._strat_vale=a;
- xml[i]._end_vlaue=b;
- }
- sort(xml+1,xml+1+n);
- s=xml[1]._end_vlaue;
- res=1;
- for(i=2;i<=n;i++)
- if(s<xml[i]._strat_vale)
- res++,s=xml[i]._end_vlaue;
- cout<<n-res<<endl; //相交区间的个数
- }
- }