nyoj 12 喷水装置(二)【贪心】+【区间完全覆盖覆盖】

题意:。。。

这道题就是区间问题三种中的区间完全覆盖问题,不懂的可以看我上一篇也是区间完全覆盖。

直接上代码:

#include <stdio.h>
#include <math.h>
#include <algorithm>
using std::sort;
struct node{
	double le, ri;
}s[1005];
int cmp(node a, node b)
{
	return a.le < b.le;
}
int main()
{
	int n, t;
	double w, h;
	scanf("%d", &t);
	while(t --){
		scanf("%d%lf%lf", &n, &w, &h);
		h /= 2;  //要除去2
		int i, j;
		double temp, r;
		for(i = 0, j = 0; i < n; i ++){
			scanf("%lf%lf", &temp, &r);
			if(r <= h) continue;//如果不能,喷洒到俩边或刚好喷洒到两边
			else{
				double temp1 = sqrt(r*r-h*h);//求最长能够形成矩形的宽度
				s[j].le = temp -temp1;//左边界
				s[j++].ri = temp+temp1;//右边界
			}
		}
		sort(s, s+j, cmp);//排序
	//	for(i = 0; i < j; i ++){
	//		printf("%lf %lf..\n", s[i].le, s[i].ri);
	//	}
		if(s[0].le > 0) {printf("0\n"); continue;} //如果第一个要大于0, 就是0到不了,直接输出0
		double end = 0;
		i = 0;
		int cou = 0;
		while(end <= w&&i < j&&cou <= n){//区间覆盖核心代码这里的
			temp = end;
			while(s[i].le <= end&&i <j ){
				if(s[i].ri > temp) temp = s[i].ri;
				i++;
			}
			end = temp+0.000001;//每次都只加上0.00001,俩区间有断点,就能区分
			++cou;
		}
		if(end < w||cou > n){//如果cou>n 就说明有断点, end<w说明到达不了w
			printf("0\n");
		}
		else{ 
			printf("%d\n", cou);
		}
	}
	return 0;
} 
题目链接:点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值