首页 > 编程语言 >三分算法!!!!

三分算法!!!!

时间:2023-07-18 13:33:46浏览次数:45  
标签:2.0 double dis mid 算法 midmid include 三分

 意思就是有两个传送带在xy坐标轴中,一个是a到b的传送带,一个是c到d的传送带,然后跟你3个速度,问你最短时间从a到d点。

 

三分算法与二分的区别在与二分是用一个中点求值且必须在一个单调的线段上,而三分就是在一个存在峰值的线段上通过三等分找到峰值在哪里。

 

题解:首先最短距离应该是在ab上的一个点到cd上的一个点然后在到d点,这个是最快的。但是这两个点我们不知道,要快速找出这两个点就需要用到三分算法,和二分类似。

 

首先我们先去三分a到b然后把三等分点放到c到d的三方中在c到d找出一个点让ab来到cd的距离尽可能短,判断就是ab的点来到cd的点加上到d的距离即可,一点点缩小三分范围,求出最优点;

然后又回到ab的三分循环,利用a到ab点的距离加上刚刚的最优点距离判断,看看这两个ab的三分点谁最优然后在进行变换区间,一个个全部枚举完就可以了。

代码

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define int long long
using namespace std;
const double eps=1e-8;
struct G{
    double x,y;
};
G a,b,c,d;
int p,q,r1;
double ans=1e8;
double dis(G l,G r)
{
    return sqrt((l.x-r.x)*(l.x-r.x)+(l.y-r.y)*(l.y-r.y));
}
double f(G mid ,G midmid)
{
    return dis(mid,midmid)/r1+dis(midmid,d)/q;
}
double cd(G mid1)
{
    double N;
    G l,r;
    l.x=c.x,l.y=c.y;
    r.x=d.x,r.y=d.y;
    do{
        G mid, midmid;
        mid.x = (l.x + r.x) / 2.0;
        mid.y = (l.y + r.y) / 2.0;
        midmid.x = (mid.x + r.x) / 2, 0;
        midmid.y = (mid.y + r.y) / 2.0;
        if (f(mid1, mid) < f(mid1, midmid)) {
            N=min(ans,f(mid1,mid));
            r=midmid;
        }
        else
        {
            N=min(ans,f(mid1,midmid));
            l=mid;
        }
    } while (dis(l,r)>eps);
    return N;
}
int main()
{
    cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y;
    cin>>p>>q>>r1;
    G l,r;
    l.x=a.x,l.y=a.y,r.x=b.x,r.y=b.y;
    do
    {
        G mid,midmid;
        mid.x=(l.x+r.x)/2.0;
        mid.y=(l.y+r.y)/2.0;
        midmid.x=(mid.x+r.x)/2.0;
        midmid.y=(mid.y+r.y)/2.0;
        double ans1=cd(mid);
        double ans2=cd(midmid);
        
        ans1+=dis(a,mid)/p;
        ans2+=dis(a,midmid)/p;
        if(ans1<ans2)
        {
            ans=min(ans,ans1);
            r=midmid;
        }
        else
        {
            ans=min(ans,ans2);
            l=mid;
        }
    } while (dis(l,r)>eps);
    printf("%0.2lf",ans);
    return 0;
}

 

标签:2.0,double,dis,mid,算法,midmid,include,三分
From: https://www.cnblogs.com/whatdo/p/17562676.html

相关文章

  • 万年历matlab算法,万年历算法(万年历算法和分析)[通俗易懂]
    万年历matlab算法,万年历算法(万年历算法和分析)[通俗易懂]发布于 2022-07-2213:47:314460举报大家好,又见面了,我是你们的朋友全栈君。年历的计算方法:关键是求出当年1月1日是星期几。书上给出了当年份Y>。用蔡勒(Zeller)公式即w=y+[y/4]+[c/4]-2c+[26......
  • BP神经网络算法
    BP是反向的意思神经网络并不能建立先验关系,而是黑箱关系激活函数需要连续,因为后面我们要求min(f(x)-A),我们求最小值的时候,是求导之后导函数的最小值处BP神经网络的最大误差是容易求局部最优解、神经网络可以用于预测或评价、分类问题只要是建立两个对象之间的......
  • 算法练习-day18
    二叉树654.最大二叉树题意:给定一个不重复的整数数组 nums。 最大二叉树 可以用下面的算法从 nums递归地构建:创建一个根节点,其值为 nums中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值右边的 子数组后缀上 构建右子树。返回 nums......
  • RLChina2022公开课-博弈搜索算法
    序列决策序列决策问题一般用马尔可夫决策模型进行描述搜索算法的优化......
  • RLChina2022-实践课三:强化学习算法
    MDP算法MDP被定义为一个元组(S,A,P,r,R)S:所有状态集合A:在环境力里面智能体所作动作的集合P:状态转移函数P(s'|s,a),智能体在当前s下,执行a之后,转移到是s'的概率R:奖励函数R(s,a),表示在环境s下执行动作a之后获得的立即奖励,有时候还需要知道s'是多少才能共同决定奖励是多少。......
  • 数值修约算法
    1、Java版本点击查看代码importcom.github.pagehelper.util.StringUtil;importstaticcn.hutool.core.convert.Convert.toStr;importstaticorg.springframework.util.ObjectUtils.isEmpty;/***数值、精度、修约规则*<pre>*实例代码:*......
  • 算法_贝叶斯网络学习_bayesian networks
    基本概念条件概率联合概率边缘概率链式法则随机变量的独立性条件独立性贝叶斯规则、贝叶斯概率推理和贝叶斯网络模型。stochastic,主要用作形容词,主要意思为“随机的;猜测的”R语言包R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析lme4广义线性混合模型......
  • 拓扑排序算法相关的知识点总结
    拓扑排序算法相关的知识点总结拓扑排序算法是一种对有向无环图(DAG)进行排序的方法,它可以将图中的所有顶点排成一个线性序列,使得对于任意一对顶点u和v,如果存在一条从u到v的有向边,那么u在序列中必然出现在v之前。拓扑排序算法可以用来解决一些依赖关系的问题,例如课程安排、工程进度......
  • java原地算法
    原地算法:优化内存空间的Java编程技巧随着计算机科学的发展,我们不断追求更高效的算法和更低的内存消耗。在Java编程中,原地算法是一种常见的优化技巧,它可以大大减少对内存的使用,提高程序的性能。本文将介绍什么是原地算法,为什么要使用它以及如何在Java中实现。什么是原地算法?原地......
  • 代码随想录算法训练营第三十二天| 343. 整数拆分 96.不同的二叉搜索树
     343.整数拆分要求:将一个正数拆分成N个正整数,使得这N个正整数的乘机是最大的思路:DP数组:dp[n]N的时候,它的乘机最大值注意:不是i*dp[n-i]就是最大值,因为如果用dp就证明要开始拆分了,如果我不拆分,就是用的这两个数的话,那么就是单纯的i*(n-i)代码:1//要求:将N拆分成K......