最大不相交区间数的一道题是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\n",ans); 60 } 61 }
最少区间数覆盖问题,给定一个长度n和m个区间,要求用最少的区间将长度为n的区间完全覆盖。策略是这样的:首先设定区间的最右端点maxr=0,扫描所有的区间,取得最左端值小于等于maxr且最右端值最大的区间,并且更新maxr的值为这个区间的最右端值,这样迭代下去,直到maxr大于等于n。这也是一种贪心策略,每一步都用可能的最长的区间去覆盖,最终一定能得到最少区间数量覆盖。
原文地址:https://www.cnblogs.com/randy-lo/p/12620100.html
时间: 2024-10-30 03:49:28