• POJ 1328 贪心、快排/求最少雷达数量


    对于每个岛屿,计算出在区间[A,B]内必须有一个雷达,对这些区间的左坐标进行排序

    第一个岛屿的右坐标为right,

    初始雷达数量为1,对于第二个岛屿,如果它的右坐标比right小,则说明区间2包含了区间1,不用增加雷达数量,并设置right = 岛屿2的右坐标;

    如果它的右坐标比right大,又岛屿2的左坐标大于right,则雷达数量+1,并设置right = 岛屿2的右坐标.

    #include <algorithm>
    #include <math.h>
    #include <iostream>
    using namespace std;
    typedef struct island{
    	double l;
    	double r;
    }Node;
    int   qcmp(   const   void   *arg1,   const   void   *arg2   )   
    {   
    	
    	return   (((Node*)arg1)->l >  ((Node*)arg2)->l)?1:-1;
    }
    int   cmp(   Node   arg1,   Node   arg2   )   
    {   
    	
    	return   arg1.l<  arg2.l;
    }
    int main(int argc, char* argv[])
    {
    	//freopen("d:/t.txt","r",stdin);
    	int count;
    	int r;
    	
    	int c = 0;
    	while(cin>>count>>r&&(count||r)){
    		bool err = false;
    		Node n[1000];
    		c++;
    		for(int i=0;i<count;i++){
    			double x,y;
    			cin>>x>>y;
    			y=y<0?-y:y;
    			if(y>r){
    				err = true;
    			}
    			double d = sqrt(r*r-y*y);
    			
    			n[i].l = x-d;
    			n[i].r = x+d;
    			
    		}
    		if(err)
    		{
    			printf("Case %d: -1\n",c);
    			continue;
    		}
    		qsort(n,count,sizeof(n[0]),qcmp);
    		//sort(n,n+count,cmp);
    		
    		int ans = 1;
    		double left = n[0].r;
    
    		for(int j=1;j<count;j++){
    			if(n[j].r<=left){
    				left = n[j].r;
    			}else{
    				if(n[j].l>left){ans++;left = n[j].r;}
    			}
    		}
    		printf("Case %d: %d\n",c,ans);
    			
    	}
    	return 0;
    }

    躲猫猫社团团长 http://t.sina.com.cn/coolria

  • 相关阅读:
    EL表达式具体解释
    Android 实战美女拼图游戏 你能坚持到第几关
    redis sentinel安装及配置(单机版)
    ElasticSearch scroll查询 api
    springboot自动配置原理
    kafka实践
    Springboot mybatis
    计算机原理
    快速排序算法
    maven常见报错问题
  • 原文地址:https://www.cnblogs.com/yangyh/p/2077972.html
Copyright © 2020-2023  润新知