HDU3400 三分

本文针对特殊几何场景下的一道编程题进行了解析,通过使用do while循环解决了当输入的两条直线接近或重合为一点时的错误情况。文章提供了一份通过测试的C++代码,并详细解释了关键算法步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上题解很多我就不多说了

最关键的一步WA了我两发了

煞笔了,就是如果其中一条直线十分接近甚至是一个点的时候就会出现BUG

所以应该用do   while


下面是AC代码


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define eps 1e-6

using namespace std;

class point
{
public:
    double x,y;
};

double p,q,z,ans;
point a,b,c,d;
double thtw(point k);

inline double cal(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void thon()
{
    point l=a,r=b,mid,midmid;
    do
    {
        mid.x=(l.x+r.x)/2;
        mid.y=(l.y+r.y)/2;
        midmid.x=(l.x+mid.x)/2;
        midmid.y=(l.y+mid.y)/2;
        double msum,mmsum;
        msum=cal(a,mid)/p+thtw(mid);
        mmsum=cal(a,midmid)/p+thtw(midmid);
        if(msum+eps<=mmsum)
            l=midmid;
        else r=mid;
        ans=min(msum,mmsum);
    }while(cal(l,r)>=eps);
}

double thtw(point k)
{
    point l=c,r=d,mid,midmid;
    double kao;
    do
    {
        mid.x=(l.x+r.x)/2;
        mid.y=(l.y+r.y)/2;
        midmid.x=(l.x+mid.x)/2;
        midmid.y=(l.y+mid.y)/2;
        double msum,mmsum;
        msum=cal(k,mid)/z+cal(mid,d)/q;
        mmsum=cal(k,midmid)/z+cal(midmid,d)/q;
        if(msum+eps<=mmsum)
            l=midmid;
        else r=mid;
        kao=min(msum,mmsum);
    }while(cal(l,r)>=eps);
    return kao;
}


int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ans=0;
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y);
        scanf("%lf%lf%lf",&p,&q,&z);
        thon();
        printf("%.2f\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值