HDU 4454Stealing a Cake(枚举或者三分)
发布时间: 2013-10-13 14:03:53 作者: rapoo
HDU 4454Stealing a Cake(枚举或者三分)
1 1-1 1 10 -1 1 00 2-1 1 10 -1 1 00 0
1.752.00
#include<iostream>#include<cstring>#include<string>#include<cmath>#include<cstdio>using namespace std;double xx1,yy1,xx2,yy2;const double eps=1e-8;const double PI=acos(-1.0);struct Point{ double x; double y;};Point ant;struct mm{ double x; double y; double r; //圆的半径};mm cake;double cal(double angle){ double sum1,sum2,ans; double xx,yy; //表示圆上角度刚好为angle的点 xx=cake.x+cake.r*cos(angle); yy=cake.y+cake.r*sin(angle); sum1=sqrt((xx-ant.x)*(xx-ant.x)+(yy-ant.y)*(yy-ant.y)); //sum1为ant到cake的距离 sum2=0; //sum2为cake到home的距离 if(xx<xx1) //在矩形的左半边 { if(yy>=yy1&&yy<=yy2) sum2=xx1-xx; else if(yy<yy1) sum2=sqrt((xx-xx1)*(xx-xx1)+(yy-yy1)*(yy-yy1)); else sum2=sqrt((xx-xx1)*(xx-xx1)+(yy-yy2)*(yy-yy2)); } else if(xx>xx2) //在矩形的右半边 { if(yy>=yy1&&yy<=yy2) sum2=xx-xx2; else if(yy<yy1) sum2=sqrt((xx-xx2)*(xx-xx2)+(yy-yy1)*(yy-yy1)); else sum2=sqrt((xx-xx2)*(xx-xx2)+(yy-yy2)*(yy-yy2)); } else { if(yy<=yy1) sum2=yy1-yy; else sum2=yy-yy2; } ans=sum1+sum2; return ans;}int main(){ double txx1,tyy1,txx2,tyy2; while(~scanf("%lf%lf",&ant.x,&ant.y)) { if(ant.x==0&&ant.y==0) break; scanf("%lf%lf%lf",&cake.x,&cake.y,&cake.r); scanf("%lf%lf%lf%lf",&txx1,&tyy1,&txx2,&tyy2); //xx1,yy1,xx2,yy2; 两个对角线构成home矩形 xx1=txx1<txx2?txx1:txx2; yy1=tyy1<tyy2?tyy1:tyy2; xx2=txx1>txx2?txx1:txx2; yy2=tyy1>tyy2?tyy1:tyy2; double l,r,mid,mimid; double mid1,mid2; //把圆分成两半来三分,因为从0~2*PI二分,在ant的另一边也有个最小值,但那个并不是最小的 l=0,r=PI; while(r-l>eps) { mid=(l+r)/2.0,mimid=(r+mid)/2.0; if(cal(mid)<cal(mimid)) r=mimid; else l=mid; } mid1=mid; l=PI,r=2*PI; while(r-l>eps) { mid=(l+r)/2.0,mimid=(r+mid)/2.0; if(cal(mid)<cal(mimid)) r=mimid; else l=mid; } mid2=mid; double res=cal(mid1)<cal(mid2)?cal(mid1):cal(mid2); printf("%.2f\n",res); } return 0;}//0MS