hdu 4454

来源:互联网 发布:python中文网站 编辑:程序博客网 时间:2024/05/17 01:27


题意:

给一个蚂蚁的起点,一个二维的圆形蛋糕,和一个矩形,如何从起点出发,经过蛋糕,回到矩形,使得距离最小。


题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4454


思路:

对圆进行三分,对选到的圆上的点,可惜对 圆进行三分的时候,分为两个区间[0,pi] [pi ,pi * 2];

再对矩形四条边进行枚举,经过比较



#include <iostream>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>using namespace std;#define eps 1e-8#define pi 3.1415926#define inf 0x3f3f3f3ftypedef struct point{    double x,y;}p;p start;typedef struct circle{    double x,y,r;}P;P circle;double xa,ya,xc,yc;double dis(double x,double y,double a,double b){    return sqrt((x-a)*(x-a)+(y-b)*(y-b));}double calc_cd(double ang){    double ans = inf , temp;    double x = circle.x + circle.r * cos(ang);    double y = circle.y + circle.r * sin(ang);    double avg = (xc - xa) /1000;    for(int i=0;i<=1000;i++){        temp = dis(xa + i *avg, ya,x,y);        if(temp < ans) ans = temp;    }    avg = (xc - xa)/1000;    for(int i=0;i<=1000;i++){        temp = dis(xa + i *avg, yc, x , y);        if(temp < ans) ans = temp;    }    avg = (yc - ya)/1000;    for(int i=0;i<=1000;i++){        temp = dis(xa,ya + i *avg,x,y);        if(temp < ans) ans = temp;    }    avg = (yc - ya)/1000;    for(int i=0;i<=1000;i++){        temp = dis(xc,ya + i *avg,x,y);        if(temp < ans) ans = temp;    }    return ans;}double calc_ab(double ang){    double x = circle.x + circle.r * cos(ang);    double y = circle.y + circle.r * sin(ang);    return dis(start.x, start.y , x, y) + calc_cd(ang);}double slove_ab(double left,double right){    double mid,midmid;    double mid_val,midmid_val;    while(left + eps< right){        mid = (left + right)/2;        midmid = (mid + right)/2;        mid_val = calc_ab(mid);        midmid_val = calc_ab(midmid);        if(mid_val < midmid_val) right = midmid;        else left = mid;    }    return calc_ab(left);}int main(){    double t;    while(~scanf("%lf %lf",&start.x,&start.y)){        if(start.x == 0 && start.y == 0) break;        scanf("%lf %lf %lf",&circle.x,&circle.y,&circle.r);        scanf("%lf %lf %lf %lf",&xa,&ya,&xc,&yc);        if(xa>xc){t=xa,xa=xc,xc=t;}        if(ya>yc){t=ya,ya=yc,yc=t;}        double ans = min(slove_ab(0,pi),slove_ab(pi,pi*2));        printf("%.2lf\n",ans);    }    return 0;}



一直wa,  在枚举矩形的时候,边界直接忽略,,,

原创粉丝点击