• Radar Installation


    POJ

    题意:假设滑行是无限直线。土地位于海岸线的一侧,另一侧是海洋。每个小岛都位于海边。并且位于滑行的任何雷达装置只能覆盖d距离,因此如果它们之间的距离最多为d,则可以通过半径装置覆盖海中的岛屿。我们使用笛卡尔坐标系,定义滑行是x轴。海侧在x轴上方,陆侧在下方。考虑到每个岛屿在海中的位置,并考虑到雷达装置覆盖范围的距离,您的任务是编写一个程序,以找到覆盖所有岛屿的最小数量的雷达装置。注意,岛的位置由其xy坐标表示。

    分析:对于每个建筑物,可以计算出x轴上能管辖它的一段区间,于是题目转化为了有n段区间,选择尽量少的点使得所有区间包含至少一个选了的点.考虑贪心,把区间按照左端点从小到大排序,开一个变量pos记录当前最后一台设备的位置,对于一个区间,如果包含pos则不用新开设备,但要更新(pos=min(pos,r[i]));否则就要新开一个设备,同时令(pos=r[i]).

    //#include<bits/stdc++.h>
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    inline int read(){
        int x=0,o=1;char ch=getchar();
        while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
        if(ch=='-')o=-1,ch=getchar();
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*o;
    }
    struct ppx{
    	double l,r;
    }a[1005];
    inline bool cmp(const ppx &x,const ppx &y){return x.l<y.l;}
    int main(){
    	int T=0;
    	while(1){
    		int n=read(),d=read();if(!n&&!d)break;
    		printf("Case %d: ",++T);int bj=0;
    		for(int i=1;i<=n;++i){
    			int x=read(),y=read();
    			a[i].l=x*1.0-sqrt(d*d*1.0-y*y*1.0);
    			a[i].r=x*1.0+sqrt(d*d*1.0-y*y*1.0);
    			if(y>d)bj=1;
    		}
    		if(bj){puts("-1");continue;}
    		else{
    			sort(a+1,a+n+1,cmp);
    			int ans=1;double pos=a[1].r;
    			for(int i=2;i<=n;++i){
    				if(a[i].l>pos)++ans,pos=a[i].r;
    				else pos=min(pos,a[i].r);
    			}
    			printf("%d
    ",ans);
    		}
    	}
        return 0;
    }
    
    
  • 相关阅读:
    IIS 禁止自动回收
    误删除系统帐户且SA被禁用,如何修复?单用户模式登录可解决。
    不到100行代码实现SHELL环境下图形化的IP设置功能
    2021总结
    快排
    Windows 10 修改用户名及Users文件夹
    DATUM支持不同格式(JSON,CSV,SQL,XML等)的在线模拟数据生成器
    记:云服务器被暴破感染bioset
    前端项目修改npm/yarn配置文件来加速包下载
    十个前端常见手写功能
  • 原文地址:https://www.cnblogs.com/PPXppx/p/11234121.html
Copyright © 2020-2023  润新知