Dispositivo de radar (codicioso)

Dispositivo de radar

Inserte la descripción de la imagen aquí

Ideas para resolver problemas

Para cada edificio (x, y),
podemos calcular el intervalo de construcción del radar [l, r] que puede detectar el objeto en el eje x, que se obtiene
mediante el teorema de Pitágoras :
l = x- d 2 - y 2 2 \ sqrt [2] {d ^ 2-y ^ 2}2re2-y2 r = x + d 2 - y 2 2 \ sqrt [2] {d ^ 2-y ^ 2}2re2-y2
Cuando d 2 -y 2 <0 , es decir, d <y cuando
el edificio probablemente no será el radar de la investigación
, podemos convertir todos los edificios para construir el rango del radar de
modo que el problema se convierta en
un intervalo dado de n
búsqueda al menos unos pocos puntos pueden cubrir todos los intervalos

Estrategia codiciosa :
1. Presione el extremo derecho de la fila en orden
ascendente 2. Si el rango actual contiene una selección del último punto, omite
o coloca un nuevo punto en el punto final derecho del intervalo

Código AC

#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,d,x,y,s=1;
double tail;
struct node
{
    
    
	double l,r;
}a[1005];
bool cmp(node x,node y)
{
    
    
	return x.r<y.r;
}
int main()
{
    
    
	scanf("%d%d",&n,&d);
	for(int i=1;i<=n;i++)//将建筑物转区间
	{
    
    
		scanf("%d%d",&x,&y);
		if(d<y){
    
    printf("-1");return 0;}//特判
		a[i].l=x-sqrt(d*d-y*y);
		a[i].r=x+sqrt(d*d-y*y); 
	}
	sort(a+1,a+n+1,cmp);//排序
	tail=a[1].r;//初值
	for(int i=2;i<=n;i++)//贪心
	 if(a[i].l>tail){
    
    s++;tail=a[i].r;}
	printf("%d",s); 
	return 0;
}

Gracias

Supongo que te gusta

Origin blog.csdn.net/weixin_45524309/article/details/112058118
Recomendado
Clasificación