Week3 作业 B - 区间选点

问题描述:

数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)

思路:

贪心指标:选的点尽可能覆盖更多区间;所以将区间的右端点按升序排列,按顺序取,如果当前最靠右的点能覆盖当前的区间,就继续取,否则就把最靠右的点设为当前区间的右端点;

正确性:假设当前在第i个区间,则第i+1个区间的左端点要么在r[i]的左边,要么在r[i]的右边,两种情况下上述算法得到的都不比最优解差。

代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 struct sec   //sec==section表示一段区间
 6 {
 7     int l,r;
 8     bool operator < (const sec &x) const 
 9     {
10         return r<x.r;
11     } 
12 }a[10005];
13 int main()
14 {
15     int last=-0xFFFFF,ans=0;
16     int n; cin>>n;
17     for(int i=1;i<=n;i++)
18         scanf("%d %d",&a[i].l,&a[i].r);
19     sort(a+1,a+n+1);
20     
21     for(int i=1;i<=n;i++)   //按右边界依次取区间 
22         if(a[i].l>last) ans++,last=a[i].r;
23     cout<<ans<<endl;
24 } 
25  

 

posted @ 2020-03-20 09:32  菜鸡今天学习了吗  阅读(160)  评论(0编辑  收藏  举报