hdu 2899 hdu 3400 三分/几何

本文介绍了使用三分法解决HDU 2899和HDU 3400两个算法题的具体实现过程。三分法是一种高效求解一维连续单调函数极值的方法,适用于函数在定义域内先减后增的情况。文章通过代码示例展示了如何利用三分法找到最优解。

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

hdu2899 ;

水提,直接三分,其实求导后二分也可以。

#include<iostream>
#include<cstdio>
using namespace std;
  double y;
  double inline f( long double x)
{
    return 6*x*x*x*x*x*x*x+8*x*x*x*x*x*x+7*x*x*x+5*x*x-y*x;
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        cin>>y;
        double l,r,m1,m2;
        l=0;r=100;
        while(r-l>0.000001)
        {
            m1=l+(r-l)/3;
            m2=r-(r-l)/3;
            if(f(m1)<f(m2))
            {
                r=m2;
            }
            else
            {
                l=m1;
            }
        }
       printf("%.4lf\n",f(l));
    }
    return 0;
}


hdu3400  有俩个未知,第一次确定,则第二个函数式先见后增的,而第二个反馈出最小值后,第一个未知也是先见后增的,所以三分套三分(九分??呵呵~)

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
struct xy
{
    double x,y;
};
double inline dis( xy a,xy b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
xy A,B,C,D;    int p,q,r;
double inline s(xy a ,xy b)
{
    return dis(a,A)/p+dis(a,b)/r+dis(b,D)/q;
}
double f(xy t)
{
     xy l,r,m1,m2;
     l=C;r=D;
        while(dis(r,l)>0.0001)
        {
            m1.x=l.x+(r.x-l.x)/3;
            m1.y=l.y+(r.y-l.y)/3;
            m2.x=r.x-(r.x-l.x)/3;
            m2.y=r.y-(r.y-l.y)/3;
            if(s(t,m1)<s(t,m2))
            {
                r=m2;
            }
            else
            {
                l=m1;
            }
        }
        return s(t,l);
}

int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        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("%d%d%d",&p,&q,&r);
        xy l,r,m1,m2;
        l=A;r=B;
        while(dis(r,l)>0.0001)
        {
            m1.x=l.x+(r.x-l.x)/3;
            m1.y=l.y+(r.y-l.y)/3;
            m2.x=r.x-(r.x-l.x)/3;
            m2.y=r.y-(r.y-l.y)/3;
            if(f(m1)<f(m2))
            {
                r=m2;
            }
            else
            {
                l=m1;
            }
        }
       printf("%.2lf\n",f(l));
    }
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值