选择不相交区间(区间选点问题)
Posted aininot260
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择不相交区间(区间选点问题)相关的知识,希望对你有一定的参考价值。
为啥把这两个问题放在一起?因为这两个问题可以用同样的程序来实现!!
请注意刘汝佳算法竞赛入门经典在进行区间选点问题的讨论时,有一句话没有任何意义:b相同时a从大到小排序
因为排不排结果没有任何区别
程序实现的思路是把所有的边按照右端点从小到大排序
设置一个tmp初值为极小值,然后考虑每一条边,每次都拿这条边的左端点和tmp进行比较
如果当前边左端点的值大于tmp,就将当前边右端点的值赋值给tmp,同时结果+1
再阐述一下刚才的两个问题
选择不相交区间:选择尽量多的区间使得这些区间两两没有公共点
区间选点问题:选择尽量少的点使得每个区间内都至少有一个点
这两个问题都可以用上述程序实现~
代码如下:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=1005; 5 struct Extent 6 { 7 int l,r; 8 }e[maxn]; 9 int n; 10 bool cmp(Extent x,Extent y) 11 { 12 return x.r<y.r; 13 } 14 int ans=0; 15 int main() 16 { 17 cin>>n; 18 for(int i=1;i<=n;i++) 19 { 20 cin>>e[i].l>>e[i].r; 21 if(e[i].l>e[i].r) 22 swap(e[i].l,e[i].r); 23 } 24 25 sort(e+1,e+n+1,cmp); 26 int tmp=-1; 27 for(int i=1;i<=n;i++) 28 { 29 if(e[i].l>tmp) 30 { 31 tmp=e[i].r; 32 ans++; 33 } 34 } 35 cout<<ans<<endl; 36 return 0; 37 }
以上是关于选择不相交区间(区间选点问题)的主要内容,如果未能解决你的问题,请参考以下文章