hdu 4454 Stealing a Cake 三分法

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

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

代码如下:

 

  1 #include<iostream>

  2 #include<stdio.h>

  3 #include<algorithm>

  4 #include<iomanip>

  5 #include<cmath>

  6 #include<cstring>

  7 #include<vector>

  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

 

 

 

你可能感兴趣的:(HDU)