贪心法——区间的最大覆盖数
2014-11-30 14:49
162 查看
此题来源于BestCode第20期第二题。
简单介绍下题意:
给一组区间,求在大的区间覆盖数。每组测试数据小于100000,每个区间的范围数Xi、Yi小于10的9次方.
② 既然开不出这么大的数组,只能考虑着存每个区间的范围。开一个100000的二维数组a存每个区间的范围,然后用每个区间的start值在各个区间中进行比较存于数组b中,对数组b快速排序,输出最大值即可。但是此种方法超时,PASS
③ 贪心就是我们的最终解法。当然这么巧妙地解法也不是我们的原创的,还是VID想起之前做的一道题,稍作该做改动才AC的。
1.对每组区间按左端点值sta进行排序.
2.当m不为0时循环以下操作.
①选出未被访问的全部两两不相交的区间,对每个区间做访问标记,同时m--;
②times++
这个方法的核心思想还是贪心。每次选出的不相交的区间可以想象成:选出不相交的区间,间断连接组成一条连线。剩下的区间之所以没被选中,肯定是因为与此条线的某个线段有交集(没交集就被合并了)。所以下次循环选出的连线,与之前的连线至少会有一点相交。所以说,我们能选出几条这样的连线,我们的区间最大覆盖数就是几。
这种算法的典型应用还有活动安排的问题和CPU处理进程问题。
附AC代码,其中先输入测试组数,其次输入每组区间数,最后输入各个区间(sta,end)。
简单介绍下题意:
给一组区间,求在大的区间覆盖数。每组测试数据小于100000,每个区间的范围数Xi、Yi小于10的9次方.
想法:
① 看完题的第一反应联想到的是校门外的数,可以类似的开一个相应的数组表示区间,初始化为0,表示被覆盖的次数。每输入一个区间,将对应的区间+1。最后遍历一遍数组,输出最大值即可。但是仔细审题后发现不可以这么做,Xi与Yi的最大值过大,开不出这么大的数组。所以此种想法PASS② 既然开不出这么大的数组,只能考虑着存每个区间的范围。开一个100000的二维数组a存每个区间的范围,然后用每个区间的start值在各个区间中进行比较存于数组b中,对数组b快速排序,输出最大值即可。但是此种方法超时,PASS
③ 贪心就是我们的最终解法。当然这么巧妙地解法也不是我们的原创的,还是VID想起之前做的一道题,稍作该做改动才AC的。
算法:
设m表示区间个数,times初始化为0表示覆盖次数1.对每组区间按左端点值sta进行排序.
2.当m不为0时循环以下操作.
①选出未被访问的全部两两不相交的区间,对每个区间做访问标记,同时m--;
②times++
这个方法的核心思想还是贪心。每次选出的不相交的区间可以想象成:选出不相交的区间,间断连接组成一条连线。剩下的区间之所以没被选中,肯定是因为与此条线的某个线段有交集(没交集就被合并了)。所以下次循环选出的连线,与之前的连线至少会有一点相交。所以说,我们能选出几条这样的连线,我们的区间最大覆盖数就是几。
这种算法的典型应用还有活动安排的问题和CPU处理进程问题。
附AC代码,其中先输入测试组数,其次输入每组区间数,最后输入各个区间(sta,end)。
#include<stdio.h> #include<stdlib.h> struct Table { int sta; int end; int vist; }; struct Table table[100005]; int cmp(const void *a,const void *b) { return (*(struct Table *)a).sta-(*(struct Table *)b).sta; } int main() { int test,n,m,i,s,t,times,temp; scanf("%d",&test); while(test--) { scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&s,&t); if(s>t) { s=s+t; t=s-t; s=s-t; } table[i].sta=s; table[i].end=t; table[i].vist=0; } qsort(table,n,sizeof(struct Table),cmp); temp=0; times=0; m=n; while(m) { for(i=0;i<n;i++) { if(!table[i].vist&&table[i].sta>temp) { temp=table[i].end; table[i].vist=1; m--; } } temp=0; times++; } printf("%d\n",times); } return 0; }
相关文章推荐
- 贪心——区间覆盖问题之最大不相交覆盖问题
- FZU 2144 Shooting Game(球体方程和直线方程联立+贪心区间覆盖)
- 区间覆盖问题(贪心)
- FZU - 2144 Shooting Game(贪心,区间覆盖问题变题)
- HDU 1050 Moving Tables (贪心 区间最大叠加数)
- Cleaning Shifts (贪心之区间覆盖)
- UVA 10382 Watering Grass (贪心 + 区间覆盖问题)
- 【BZOJ 4571】美味 【区间异或最大值】【主席树】【贪心】
- Program D--贪心-区间覆盖
- 百练+贪心区间选点+最少点覆盖尽量多的区间
- UVa 10382 - Watering Grass(贪心+区间覆盖问题)
- 分冶—递归 更有效的算法方法(棋盘覆盖,分段区间,循环赛事日程表,最大最小值 )
- NYOJ 题目710 外星人的供给站(贪心区间覆盖)
- Cleaning Shifts(贪心 区间覆盖)
- nyoj 12 喷水装置(二)【贪心】+【区间完全覆盖覆盖】
- [poj 2376] Cleaning Shifts [最小区间覆盖 贪心]
- poj 2376 贪心(覆盖区间)
- 10382 - Watering Grass(贪心 区间覆盖问题)洒水面覆盖
- HDU ACM 1050 Moving Tables(贪心 + 区间覆盖问题)
- UVALive - 4294 Shuffle 映射+取反+最大区间覆盖