博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4454 Stealing a Cake 三分法
阅读量:4649 次
发布时间:2019-06-09

本文共 2350 字,大约阅读时间需要 7 分钟。

很容易想到三分法求解,不过要分别在0-pi,pi-2pi进行三分。

另外也可以直接暴力枚举……

代码如下:

 

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #define ll __int64 9 #define pi acos(-1.0) 10 #define MAX 50000 11 using namespace std; 12 struct point 13 { 14 double x,y; 15 point(double _x=0,double _y=0){ 16 x=_x; 17 y=_y; 18 } 19 point operator-(point a){ 20 return point(x-a.x,y-a.y); 21 } 22 point operator+(point a){ 23 return point(x+a.x,y+a.y); 24 } 25 double operator*(point a){ 26 return (x*a.x+y*a.y); 27 } 28 }p1,p2,p; 29 double x,y,r; 30 double dis2(point a,point b) 31 { 32 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 33 } 34 double dis(point a, point b, point c) 35 { 36 point ab = b - a; 37 point ac = c - a; 38 double f = ab*ac; 39 if (f<0) return dis2(c, a);//C1处的点 40 double d = ab*ab; 41 if ( f>d) return dis2(c, b);//C2处的点,d=f*cos(theta) 42 f = f/d; 43 ab.x*=f;ab.y*=f; 44 point D = a + ab; // c在ab线段上的投影点 45 return dis2(c, D); 46 } 47 double line(point a) 48 { 49 point b,c; 50 b.x=min(p1.x,p2.x); 51 b.y=max(p1.y,p2.y); 52 c.x=max(p1.x,p2.x); 53 c.y=min(p1.y,p2.y); 54 double MIN1,MIN2; 55 MIN1=min(dis(p2,c,a),dis(p1,c,a)); 56 MIN2=min(dis(p1,b,a),dis(p2,b,a)); 57 return min(MIN1,MIN2); 58 } 59 point get(double a) 60 { 61 return point(x+r*cos(a),y+r*sin(a)); 62 } 63 double solve() 64 { 65 double r,l,mid,midmid,t1,t2,ans1,ans2; 66 point m1,m2; 67 r=pi;l=0; 68 while(r-l>=1e-8){ 69 mid=(r+l)/2; 70 midmid=(mid+r)/2; 71 m1=get(mid); 72 m2=get(midmid); 73 t1=line(m1)+dis2(m1,p); 74 t2=line(m2)+dis2(m2,p); 75 if(t1>t2) l=mid; 76 else r=midmid; 77 } 78 ans1=t1; 79 r=2*pi;l=pi; 80 while(r-l>=1e-8){ 81 mid=(r+l)/2; 82 midmid=(mid+r)/2; 83 m1=get(mid); 84 m2=get(midmid); 85 t1=line(m1)+dis2(m1,p); 86 t2=line(m2)+dis2(m2,p); 87 if(t1>t2) l=mid; 88 else r=midmid; 89 } 90 ans2=t1; 91 return min(ans1,ans2); 92 } 93 int main(){ 94 while(cin>>p.x>>p.y){ 95 if(fabs(p.x)<1e-8&&fabs(p.y)<1e-8) break; 96 cin>>x>>y>>r>>p1.x>>p1.y>>p2.x>>p2.y; 97 point temp; 98 temp.x=p1.x;temp.y=p1.y; 99 p1.x=min(p1.x,p2.x);p1.y=min(p1.y,p2.y);100 p2.x=max(temp.x,p2.x);p2.y=max(temp.y,p2.y);101 printf("%.2lf\n",solve());102 }103 return 0;104 }
View Code

 

 

 

转载于:https://www.cnblogs.com/xin-hua/p/3253215.html

你可能感兴趣的文章