码迷,mamicode.com
首页 > 其他好文 > 详细

!HDU 4173 到点的距离不超过2.5,找最多能被满足的点的个数-简单几何

时间:2015-07-30 02:10:27      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:hdu

题意:有n个人参加派对,但是条件是派对地点到他家的距离不能超过2.5,现在要你找一个最佳的派对地点让最多人参加派对。

分析:

题目看起来挺难的,怎么求范围然后包含点?其实一个圆心+半径不就代表一个圆了吗。

枚举求两个点的半径为2.5的圆的圆心,保存起来,然后用这些圆心求所有点到圆心的距离,记录距离小于等于2.5的点的个数,更新结果。200*199/2*200不会超时,计算就是高中基本的数学知识。仔细一些耐心一点就是了。注意计算得到的浮点数判定要用eps。

代码:

#include<iostream>
#include<cmath>
#include<algorithm>
#define eps 1e-8
using namespace std;
int n,ans,cnt;
double x[300],y[300];
struct node{
	double x,y;
}center[40000];
double dis(double a,double b,double c,double d)
{
	return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
void getcenter(int i,int j)
{
	double midx=(x[i]+x[j])/2.0;
	double midy=(y[i]+y[j])/2.0;	
	double k,b;
	if(x[i]-x[j]==0){
		double x1=sqrt(6.25-(midy-y[i])*(midy-y[i]))+x[i];
		double x2=x[i]-sqrt(6.25-(midy-y[i])*(midy-y[i]));
		center[cnt].x=x1,center[cnt++].y=midy;
		center[cnt].x=x2,center[cnt++].y=midy;
	}
	else if(y[i]-y[j]==0){
		double y1=sqrt(6.25-(midx-x[i])*(midx-x[i]))+y[i];
		double y2=y[i]-sqrt(6.25-(midx-x[i])*(midx-x[i]));
		center[cnt].x=midx,center[cnt++].y=y1;
		center[cnt].x=midx,center[cnt++].y=y2;
	}
	else{
		double k1=(y[i]-y[j])/(x[i]-x[j]);
		k=-1.0/k1;
	    b=midy-k*midx;
		double tmp1=(x[i]+k*y[i]-k*b);
		double tmp2=(x[i]+k*y[i]-k*b)*(x[i]+k*y[i]-k*b)-(k*k+1)*(x[i]*x[i]+y[i]*y[i]+b*b-2*b*y[i]-6.25);
		double x1=(tmp1+sqrt(tmp2))/(k*k+1);
		double x2=(tmp1-sqrt(tmp2))/(k*k+1);
		double y1=k*x1+b;
		double y2=k*x2+b;
		center[cnt].x=x1,center[cnt++].y=y1;
		center[cnt].x=x2,center[cnt++].y=y2;	
	}

}
int main()
{
     while(cin>>n){
     	cnt=0,ans=1;
     	for(int i=0;i<n;i++) cin>>x[i]>>y[i];
     	for(int i=0;i<n;i++){
     		for(int j=i+1;j<n;j++){
     			if(dis(x[i],y[i],x[j],y[j])<5.0+eps) getcenter(i,j);
     		}
     	}
     	for(int i=0;i<cnt;i++){
     		int tot=0;
     		for(int j=0;j<n;j++){
     			if(dis(x[j],y[j],center[i].x,center[i].y)<2.5+eps) tot++;
     		}
     		ans=max(ans,tot);
     	}
     	cout<<ans<<endl;
     }	
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

!HDU 4173 到点的距离不超过2.5,找最多能被满足的点的个数-简单几何

标签:hdu

原文地址:http://blog.csdn.net/ac_0_summer/article/details/47138991

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!