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
",solve());
102     }
103     return 0;
104 }
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3253215.html