• ZOJ 1041 Transmitters


    原题链接

    题目大意:有一个发射站,覆盖范围是半径一定的一个半圆。在一个1000*1000平方米的地盘里有很多接收站。给定发射站的圆心,求最佳角度时能覆盖接收站的个数。

    解法:本质上就是给一个原点和其他若干点,找出一个可以覆盖最多点的半圆。用了两个函数判断,一个是判断两点之间的距离,即该点到原点的距离是否在半径之内,筛选出第一步满足的点。另一个是判断两个点A、B是否在同一个半圆内,其实先确定一条直线AO,然后规定B点在AO的左侧就算在半圆内。每个点都遍历一次,找出最大值即可。

    参考代码:

    #include<iostream>
    #include<cmath>
    
    using namespace std;
    bool isInclude(int xx, int yy);
    bool isCovered(int*, int*);
    double cx,cy,r;
    
    
    int main(){
    	
    	int xx,yy,point[150][2];
    	int i,j,k,n,m,count,max;
    
    	while(cin>>cx>>cy>>r&&r>=0){
    		cin>>n;
    		m=0;
    		max=0;
    		for(i=0;i<n;i++){
    			cin>>xx>>yy;
    			if(isInclude(xx,yy)){
    				point[m][0]=xx;
    				point[m][1]=yy;
    				m++;
    			}
    		}
    		for(j=0;j<m;j++){
    			count=1;
    			for(k=0;k<m;k++){
    				if(k==j)continue;
    				if(isCovered(point[j],point[k]))
    					count++;
    				if(count>max)
    					max=count;
    			}
    		}
    		cout<<max<<endl;	
    	}
    
    	return 0;
    }
    
    bool isInclude(int xx,int yy){
    	double d;
    	d=(xx-cx)*(xx-cx)+(yy-cy)*(yy-cy);  //求两点的欧式距离
    	d=sqrt(d);
    	if(d<=r)
    		return true;
    	else
    		return false;
    }
    
    bool isCovered(int *A, int *B){
    	int ax,ay,bx,by;
    	double cc;
    	ax=A[0];bx=B[0];
    	ay=A[1];by=B[1];
    	cc=(ax-cx)*(by-cy)-(ay-cy)*(bx-cx);//判断点是否在直线的同一侧
    	if(cc>0)
    		return false;
    	else
    		return true;
    }
  • 相关阅读:
    设计模式学习笔记之设计原则
    设计模式学习笔记之生成器模式
    设计模式学习笔记之适配器模式、外观模式
    java中的日期类型之间转换
    JS刷新当前页面的几种方法总结
    Java_枚举
    动态规划详解_2
    Java算法-动态规划详解
    Java经典算法题_2
    Java算法
  • 原文地址:https://www.cnblogs.com/naive/p/3568725.html
Copyright © 2020-2023  润新知