• POJ 1328 Radar Installation


    Description
    Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, so an island in the sea can be covered by a radius installation, if the distance between them is at most d.

    We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates.

    解题报告:
    明显可以覆盖到i这个island的位置是一个区间,我们可以用(sqrt(r*r-y_i*y_i))算出来,问题就转化为给出N个区间,每次选择一个点消去所有覆盖该点的区间,问选择最少的点的个数
    那么我们按l排序,从左往右扫描,如果当前没被消去过,那么就必须得消去,因为前面都处理过了,所以不能依靠前面的消去,然后我们就考虑消去这个区间能够顺便消去哪些区间,贪心一下,随便选择能覆盖到的即可,因为对于两个互不重叠的区间,一次只能选择消去一个,另一个还是得花费一次去消除,所以随意选择一个即可

    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #define RG register
    #define il inline
    #define iter iterator
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    using namespace std;
    typedef long long ll;
    const int N=1005;
    int n,m,kase=0;bool vis[N];
    struct node{
    	double l,r;
    	bool operator <(const node &pp)const{
    		return l<pp.l;
    	}
    }a[N];
    void work()
    {
    	bool flag=false;
    	int x,y,ans=0;double s;
    	for(int i=1;i<=n;i++){
    		scanf("%d%d",&x,&y);
    		if(y>m){
    			flag=true;continue;
    		}
    		else{
    			s=sqrt((double)(m+y)*(m-y));
    			a[i].l=x-s;a[i].r=x+s;
    		}
    		vis[i]=false;
    	}
    	if(flag){printf("Case %d: -1
    ",++kase);return ;}
    	sort(a+1,a+n+1);
    	double L,R;
    	for(int i=1;i<=n;i++){
    		if(vis[i])continue;
    		ans++;L=a[i].l;R=a[i].r;vis[i]=true;
    		for(int j=i+1;j<=n;j++){
    			if(vis[j])continue;
    			if(a[j].l>=L && a[j].l<=R){
    				vis[j]=true;
    				L=Max(a[j].l,L);
    				R=Min(a[j].r,R);
    			}
     			if(a[j].r>=L && a[j].r<=R){
    				vis[j]=true;
    				L=Max(a[j].l,L);
    				R=Min(a[j].r,R);
    			}
    		}
    	}
    	printf("Case %d: %d
    ",++kase,ans);
    }
    
    int main()
    {
    	while(~scanf("%d%d",&n,&m) && n+m)
    		work();
    	return 0;
    }
    
    
  • 相关阅读:
    黑产上演《三体》剧情:蠕虫病毒入侵手机群发“钓鱼”短信
    安天AVL联合小米MIUI首擒顽固病毒“不死鸟”
    阿里云存储OSS服务端签名客户端直传
    mariadb 安装配置
    NPOI 打印设置
    windows2008 r2 网络负载均衡搭建
    SqlServer数据库技巧
    达梦数据库备份还原
    ASP.NET CORE Docker发布记录
    DataReader转换
  • 原文地址:https://www.cnblogs.com/Yuzao/p/7498361.html
Copyright © 2020-2023  润新知