HDU 1077 枚举圆心, 数学
2012-09-23 20:27
351 查看
从所有点中依次取两点,然后判断到两点m, n距离为半径1的点centre(易知center在m, n连线的中垂线上)。然后判断其余有多少点在以centre为圆心的圆内,记作ans,最后找出最大的ans,就是要求的值。
#include <iostream> #include <cmath> const double eps=1e-6; const int MAXN=305; struct point { double x,y; }; struct point ps[MAXN]; int N; double get_dis(int a,int b) { return (ps[a].x-ps[b].x)*(ps[a].x-ps[b].x)+(ps[a].y-ps[b].y)*(ps[a].y-ps[b].y); } void get_center(int a,int b) { double ox,oy,dx,dy,r,temp; ox=(ps[a].x+ps[b].x)/2; oy=(ps[a].y+ps[b].y)/2; dx=ps[b].x-ps[a].x; dy=ps[b].y-ps[a].y; ps .x=ox;ps .y=oy; temp=get_dis(N,b); r=sqrt(1.0-temp); if(fabs(dx)<eps)//竖直的情况 ps .x-=r;//+或-都可以 else { double ang=atan(-dy/dx); ps .x-=r*sin(ang);//+或-都可以 ps .y-=r*cos(ang); } } int main() { int T,i,j,k,max; scanf("%d",&T); while(T--) { scanf("%d",&N); for(i=0;i<N;i++) scanf("%lf%lf",&ps[i].x,&ps[i].y); int ans=1; for(i=0;i<N;i++)//枚举O(n^2) { for(j=i+1;j<N;j++) { if(get_dis(i,j)>=4) continue; get_center(i,j); for(k=0,max=0;k<N;k++) { if(N-k+max<=ans) break; double temp=sqrt(get_dis(k,N)); if(temp<=1.000001) max++; } if(max>ans) ans=max; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- hdu-1077-Catching Fish-计算几何、枚举圆心
- HDU 5778 abs (数学+暴力枚举)
- hdu 1077 Catching Fish 计算几何+暴力枚举
- hdu 1006 Tick and Tick 数学+枚举
- hdu 4091 Zombie’s Treasure Chest(数学规律+枚举)
- HDU 4588 Count The Carries (数学-- 二进制技巧枚举)
- HDU - 1248 寒冰王座 数学or暴力枚举
- hdu 6097 Mindis(数学几何,圆心的反演点)
- 多校7 HDU-6127 Hard challenge 几何数学,枚举极角
- hdu 3113 Sum of Cubes 数学 枚举 剪枝
- HDU 1270 小希的数表 (暴力枚举+数学)
- hdu 5109 Alexandra and A*B Problem(取模,枚举,数学数论)
- HDU-4551 生日猜猜猜 数学+枚举
- hdu 4779 Tower Defense(组合数学 枚举)
- hdu 1791 Where is the little Jgshining?(数学题--平面几何--判断圆心和判断三点是否为同一直线)
- HDU 5175 Misaki's Kiss again(数学,暴力枚举)
- The Little Girl who Picks Mushrooms(HDU - 4422)枚举 数学
- HDU 4445 ——Crazy Tank(数学题,暴力枚举)
- HDU 3349 lazy gege【数学几何】
- HDU 4770 Lights Against Dudely 【状态压缩+暴力枚举】