首页 > 其他 > 详细

Program D--贪心-区间覆盖

时间:2015-08-09 22:19:27      阅读:284      评论:0      收藏:0      [点我收藏+]

 

Given several segments of line (int the X axis) with coordinates [Li,Ri]. You are to choose the minimal amount of them, such they would completely cover the segment [0,M].

 

Input

The ?rst line is the number of test cases, followed by a blank line. Each test case in the input should contains an integer M (1 ≤ M ≤ 5000), followed by pairs

“Li Ri”( |Li|,|Ri|≤ 50000, i ≤ 100000), each on a separate line. Each test case of input is terminated by pair‘ 0 0’. Each test case will be separated by a single line.

 

Output

For each test case, in the ?rst line of output your programm should print the minimal number of line segments which can cover segment [0,M]. In the

following lines, the coordinates of segments, sorted by their left end (Li), should be printed in the same format as in the input. Pair ‘0 0’ should not be

printed. If [0,M] can not be covered by given line segments, your programm should print ‘0’ (without quotes). Print a blank line between the outputs for two

consecutive test cases.

 

Sample Input

2

1 -1 0 -5 -3 2 5 0 0

1 -1 0 0 1 0 0

 

Sample Output

0

1 0 1

 

题意:给定一个M,和一些区间[Li,Ri],要选出几个区间能完全覆盖住[0,M]区间,要求数量最少,如果不能覆盖输出0.

   

思路:贪心的思想,把区间按Ri从大到小排序,然后遇到一个满足的[Li,Ri],就更新缩小区间,直到完全覆盖。

   

注意[Li,Ri]只有满足Li小于等于且Ri大于当前覆盖区间左端这个条件。才能选中。

 

 

代码如下:

  

 

 

  

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
struct node{
	int x,y;
}a[100001],b[100001];
int cmp(node a,node b)
{
	return a.x<b.x;
}
int main()
{
	int t;
	int m,n,p,max,sum,i,f,pmax,begin,end;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&m);
		n=0;
		while(scanf("%d%d",&begin,&end))
		{
			if(begin==0&&end==0)
				break;
			if(end>=0)
			{
				a[n].x=begin;
				a[n].y=end;
				++n;
			}

		}
		sort(a,a+n,cmp);
		if(a[0].x>0)
			printf("0\n");
		else
		{
			p=0;
			max=0;
			sum=1;
			while(p+1<n&&a[p+1].x<=0)
			{
				++p;
				if(a[p].y>a[max].y)
					max=p;
			}
			p=max;
			b[1].x=a[p].x;
			b[1].y=a[p].y;
			while(p<n&&b[sum].y<m)
			{
				f=1;
				pmax=max;
				while(p+1<n&&a[p+1].x<=a[max].y)
				{
					f=0;
					++p;
					if(a[p].y>a[pmax].y)
						pmax=p;
				}
				if(f)
					break;
				max=pmax;
				++sum;
				b[sum].x=a[max].x;
				b[sum].y=a[max].y;

			}
			if(b[sum].y>=m)
			{
				printf("%d\n",sum);
				for(i=1;i<=sum;i++)
					printf("%d %d\n",b[i].x,b[i].y);
			}
			else
				printf("0\n");
		}
		if(t)
			printf("\n");
	}
	return 0;
}

Program D--贪心-区间覆盖

原文:http://www.cnblogs.com/xl1164191281/p/4716315.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!