「一本通 1.1 例 3」喷水装置

 

 

审题细节:直径小于宽的长度的数据不记录

                 覆盖范围是 x加减sqrt( r^2-(w/2)^2) 

贪心策略:           

                        预处理:我们把每个覆盖区间的边界记录,左端点小的排前

                        我们首先用一个left=0这个变量,然后我们去找每个覆盖区间左边界小于等于left的区间,并且找到一个区间最大的,然后更新left的值;继续向后查找

                        大致是这个意思,看代码的具体实现

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int W;
struct range
{
	double l, r;
	range() {}
	range(int _x, int _r)
	{
		double r1 = sqrt(_r * _r - W * W / 4.0);
		l = _x - r1;
		r = _x + r1;
	}
};
const int MAXN = 15005;
range p[MAXN];
inline bool cmp(range x, range y)
{
	return x.l < y.l;
}
int main()
{
	int T;
	scanf("%d", &T);
	for (int i = 0; i < T; i++)
	{
		int n, L, l = 0, cnt = 0;
		scanf("%d %d %d", &n, &L, &W);
		for (int j = 0; j < n; j++)
		{
			int x, r;
			scanf("%d %d", &x, &r);
			if (r << 1 >= W)
				p[l++] = range(x, r);
		}
		sort(p, p + l, cmp);
		double left = 0;
		for (int j = 0; j < l && left < L;)
		{
			double maxr = -1;
			while (p[j].l <= left && j < l)
			{
				maxr = max(maxr, p[j].r);
				j++;
			}
			if (maxr == -1)
			{
				cnt = -1;
				break;
			}
			left = maxr;
			cnt++;
		}
		printf("%d\n", cnt);
	}
	return 0;
}

这篇博客讲的很细节: #10002. 「一本通 1.1 例 3」喷水装置_TJ.的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值