选择不相交区间(区间选点问题)

为啥把这两个问题放在一起?因为这两个问题可以用同样的程序来实现!!

请注意刘汝佳算法竞赛入门经典在进行区间选点问题的讨论时,有一句话没有任何意义: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 }

猜你喜欢

转载自www.cnblogs.com/aininot260/p/9272930.html