雷达装置【贪心】

>Link

ybtoj雷达装置


>解题思路

数学知识可求,一般的坐标点可以够到的符合条件的雷达,在x轴上是一段有左右端点( l 、 r l、r lr)的区间,我们把这 n n n个区间存下
这样就转换成求最少用多少个点可以够到所有的区间了

我们把这 n n n个区间按照 r r r端点从小到大排,每次记录上一个雷达的位置,如果雷达在当前区间内,就使用这个雷达,否则就在 r r r端点建立一个新雷达。这样可以使一个雷达够到的区间最多,也就是在重合最厚的部分建雷达。


>代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define db double
#define N 1010
using namespace std;

struct node
{
    
    
	int x, y;
	db l, r;
} a[N];
int n, d, ans;
db p;

bool cmp (node aa, node bb)
{
    
    
	if (aa.r != bb.r) return aa.r < bb.r;
	return aa.l < bb.l;
}

int main()
{
    
    
	scanf ("%d%d", &n, &d);
	for (int i = 1; i <= n; i++)
	{
    
    
		scanf ("%d%d", &a[i].x, &a[i].y);
		a[i].l = a[i].x - (db)sqrt (d * d - a[i].y * a[i].y);
		a[i].r = a[i].x + (db)sqrt (d * d - a[i].y * a[i].y);
	}
	for (int i = 1; i <= n; i++)
	  if (d < abs (a[i].y)) {
    
    printf ("-1"); return 0;}
	sort (a + 1, a + 1 + n, cmp);
	ans = 1, p = a[1].r;
	for (int i = 2; i <= n; i++)
	{
    
    
		if (a[i].l <= p && p <= a[i].r) continue;
		ans++;
		p = a[i].r;
	}
	printf ("%d", ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/112137463