zoukankan      html  css  js  c++  java
  • 【luogu1325】雷达安装--贪心

    题目描述

    描述:

    假设海岸线是一条无限延伸的直线。它的一侧是陆地,另一侧是海洋。每一座小岛是在海面上的一个点。雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d。你的任务是建立尽量少的雷达站,使所有小岛都在扫描范围之内。

    数据使用笛卡尔坐标系,定义海岸线为x轴。在x轴上方为海洋,下方为陆地。

    样例1如图所示

    输入格式

    第一行包括2个整数n和d,n是岛屿数目,d是雷达扫描范围。

    接下来n行为岛屿坐标。

    输出格式

    一个整数表示最少需要的雷达数目,若不可能覆盖所有岛屿,输出“-1”。

    输入输出样例

    输入 #1
    3 2
    1 2
    -3 1
    2 1
    
    输出 #1
    2

    说明/提示

    数据范围

    n1000,d20000

     xi2×10^6,0≤yi≤20000

      贪心,求出在海岸上的一段区间,能使该雷达被扫描到,得到若干个

    区间,然后用最小的点把所有的区间覆盖。

    代码:

    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #define N 20000
    using namespace std;
    double tmp;
    int ans,n,d,x[N],y[N];
    struct node{
    	double l,r;
    }a[N];
    double cmp(node a,node b){return a.r<b.r;}
    int main()
    {
    	scanf("%d%d",&n,&d);
    	for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);
    	for(int i=1;i<=n;i++)
    	{
    		a[i].l=x[i]-sqrt(d*d-y[i]*y[i]);
    		a[i].r=x[i]+sqrt(d*d-y[i]*y[i]);
    	}
    	sort(a+1,a+n+1,cmp);
    	for(int i=1;i<=n;i++)
    	{
    		if(i==1)tmp=a[i].r,ans++;
    		else{
    			if(tmp>a[i].l)continue;
    			else tmp=a[i].r,ans++;
    		}
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    汉语-词语:什么
    汉语-词语:甚么
    汉语-汉字:心
    汉语-词汇:头脑
    汉语-词语:冰冷
    汉语-词汇:冷静
    两个int类型的数据相加,有可能会出现超出int的表示范围。
    两个int类型的数据相加,有可能会出现超出int的表示范围。
    成员变量与局部变量的区别_
    函数额基本概述
  • 原文地址:https://www.cnblogs.com/yelir/p/11574832.html
Copyright © 2011-2022 走看看