最大不相交区间数+最少区间数覆盖问题 贪心思想

Posted randy-lo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大不相交区间数+最少区间数覆盖问题 贪心思想相关的知识,希望对你有一定的参考价值。

最大不相交区间数的一道题是hdu2037

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2037

题目给出n个区间,问最多有多少个区间没有重叠,只需要对区间右端点进行排序就行,因为一个节目结束得早的话就会为其他节目留下更多的时间,如果选择对节目的开始时间进行排序的话就会导致有一个节目迟迟不结束使得其他节目又没法开始的现象。右端点最小的第一个区间时一定要选的。这个可以简单地将其他右端值更大的区间跟他交换,就会发现不会产生更多的区间数,只会小于等于我们贪心方案选出的区间数量。

代码如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef unsigned int ui;
 4 typedef long long ll;
 5 typedef unsigned long long ull;
 6 #define pf printf
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 #define prime1 1e9+7
 9 #define prime2 1e9+9
10 #define pi 3.14159265
11 #define lson l,mid,rt<<1
12 #define rson mid+1,r,rt<<1|1
13 #define scand(x) scanf("%llf",&x) 
14 #define f(i,a,b) for(int i=a;i<=b;i++)
15 #define scan(a) scanf("%d",&a)
16 #define mp(a,b) make_pair((a),(b))
17 #define P pair<int,int>
18 #define dbg(args) cout<<#args<<":"<<args<<endl;
19 #define inf 0x7ffffff
20 inline int read(){
21     int ans=0,w=1;
22     char ch=getchar();
23     while(!isdigit(ch)){if(ch==-)w=-1;ch=getchar();}
24     while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-0,ch=getchar();
25     return ans*w;
26 }
27 int n,m,t;
28 const int maxn=1e4+10;
29 struct node{
30     int l,r;
31 }p[maxn];
32 bool cmp(node& a,node& b)
33 {
34     return a.r<b.r;
35 } 
36 int main()
37 {
38     //freopen("input.txt","r",stdin);
39     //freopen("output.txt","w",stdout);
40     std::ios::sync_with_stdio(false);
41     while(scanf("%d",&n)&&n)
42     {
43         f(i,1,n)
44         {
45             p[i].l=read(),p[i].r=read();
46         }
47         p[0].r=0;
48         sort(p+1,p+n+1,cmp);
49         int ans=0;
50         int last=0;
51         f(i,1,n)
52         {
53             if(p[i].l>=last)
54             {
55                 ans++;
56                 last=p[i].r;    
57             }
58         }
59         pf("%d
",ans);
60     }
61 } 

 

 

最少区间数覆盖问题,给定一个长度n和m个区间,要求用最少的区间将长度为n的区间完全覆盖。策略是这样的:首先设定区间的最右端点maxr=0,扫描所有的区间,取得最左端值小于等于maxr且最右端值最大的区间,并且更新maxr的值为这个区间的最右端值,这样迭代下去,直到maxr大于等于n。这也是一种贪心策略,每一步都用可能的最长的区间去覆盖,最终一定能得到最少区间数量覆盖。

以上是关于最大不相交区间数+最少区间数覆盖问题 贪心思想的主要内容,如果未能解决你的问题,请参考以下文章

最大不相交区间数

三类基于贪心思想的区间覆盖问题

求区间段数问题-贪心思想

贪心算法----区间覆盖问题(POJ2376)

POJ 2376 (区间问题,贪心)

三类贪心区间覆盖问题