Program D--贪心-区间覆盖

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;
}
时间: 2024-10-22 20:38:09

Program D--贪心-区间覆盖的相关文章

10382 - Watering Grass(贪心 区间覆盖问题)洒水面覆盖

double qiuzhi(int id) { double t1=cc[id].rid*cc[id].rid; double t2=w*w/4; double t3=t1-t2; double t4=sqrt(t3); return t4; } void to_qujian() { for(int i=0; i<t; i++) { double zhi=qiuzhi(i); qq[i].a=cc[i].pos-zhi; qq[i].b=cc[i].pos+zhi; } } 典型的贪心区间覆盖问

poj 2376 贪心 区间覆盖问题

题意: 给n个区间 选择尽量少的区间 覆盖1~T这个区间 如果不能覆盖 输出-1 思路: 经典贪心 区间覆盖 将所有区间按照起点从小到大排序 取终点在最右边的那个区间 code: #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<queue>

FZU 2144(几何+贪心区间覆盖)

题意:三维空间给出n个蚊子的初始位置(ax,ay,az)和移动趋势(dx,dy,dz),那么每个蚊子坐标随时间变化的函数就是(ax+dx*t, ay+dy*t, ax+dz*t).每次射杀一枪,可以把距离原点距离len之内的蚊子全部杀死.问最多能射杀几只蚊子,这时至少要射杀几次? 解法:先求出每只蚊子在射程之内的时间区间,即(ax+dx*t, ay+dy*t, ax+dz*t)^2<=len:解一元二次方程.如果两个解都小于0,则说明此蚊子不会被杀死.算出所有能被射杀的蚊子的时间区间以后就变成了

贪心--区间覆盖及区间选点问题

区间覆盖: 数轴上有若干区间,选用最少的线段覆盖指定区间. 区间选点:选用最少的区间使每个区间内至少有一个点 样题1: J - Muddy roads Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description Farmer John has a problem: the dirt road from his farm to town has suffered in the re

nyoj 12——喷水装置二——————【贪心-区间覆盖】

喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿. 输入 第一行输入一个正整数N表示共有n次测试数据.每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度.随后的n行,

南阳OJ-12-喷水装置(二)贪心+区间覆盖

题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=12 题目大意: 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿. 传送门:喷水装置(一) 思路: 区间覆盖问题,每个点有一段喷水区间,按照左端点排序即可,设置两变量begin, end,依次扫过去,每

三类贪心区间覆盖问题

一.区间完全覆盖问题 题目 给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖. 解析 先将所有线段按起点从小到大排序.排完序后,枚举每一个线段(被其它线段包含的线段不用考虑,因为很明显包含它的线段比它更优),将其作为最左端的线段, 再在剩下的左端点小于等于最左端的线段的右端点的线段中(若没有则无解),找到右端点最大的一个线段,即贪心,很显然这是最优的,因为其左端都被最左端的线段覆盖了, 也就没有覆盖到任何地方,则其右端点越大,其右

hdoj 1050 Moving Tables【贪心区间覆盖】

Moving Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24316    Accepted Submission(s): 8053 Problem Description The famous ACM (Advanced Computer Maker) Company has rented a floor of a b

NYOJ 题目710 外星人的供给站(贪心区间覆盖)

外星人的供给站 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 外星人指的是地球以外的智慧生命.外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命基本形式的认识.比如,我们所知的任何生命都离不开液态水,并且都是基于化学元素碳(C)的有机分子组合成的复杂有机体. 42岁的天文学家Dr. Kong已经执著地观测ZDM-777星球十多年了,这个被称为"战神"的红色星球让他如此着迷.在过去的十多年中,他经常有一些令人激动的发现.ZDM-777星