当前位置: 首页 > article >正文

洛谷P2571.传送带

洛谷P2571.传送带

  • 三分模板题

  • 用于单峰函数求极值

    • 一定可以将答案路径分成三段
    • 即AE - EF - FD (E和A可能重复,F和D可能重合)
      • E在线段AB上,F在线段CD上
    • 因为有两个不定点EF,因此假设E为参数,三分求F的位置
    • 再外层三分求E的位置
    • 在这里插入图片描述
  •   #include<iostream>
      #include<cmath>
      #include<cstdio>
      #include<cstring>
      using namespace std;
      const double eps=1e-8;
      double ax,ay,bx,by,cx,cy,dx,dy,p,q,r;
      double dis(double x1,double y1,double x2,double y2)
      {
          double x_dis = x2 - x1 ,y_dis = y2 - y1;
          return sqrt(x_dis*x_dis + y_dis*y_dis);
      }
      //上图中f函数 用于三分找F
      double f(double x1,double y1,double x2,double y2)
      {
          return dis(x1,y1,x2,y2)/r + dis(x2,y2,dx,dy)/q;
      }
      double calc1(double x,double y)  //同理三分
      {
          double lx=cx,ly=cy,rx=dx,ry=dy;
          while(dis(lx,ly,rx,ry)>eps)
          {
              double tmpx = (rx - lx) / 3,tmpy = (ry - ly) / 3;
              //左三等分点 和 右三等分点
              double lmidx=lx+tmpx,rmidx=rx-tmpx,lmidy=ly+tmpy,rmidy=ry-tmpy;
              double ans1=f(x,y,lmidx,lmidy),ans2=f(x,y,rmidx,rmidy);
              if(ans2 - ans1 > eps) rx = rmidx,ry = rmidy;
              else lx = lmidx,ly = lmidy;
          }
          return f(x,y,lx,ly);
      }
      double calc()
      {
          //三分
          double lx=ax,ly=ay,rx=bx,ry=by;
          //两点不重合
          while(dis(lx,ly,rx,ry)>eps)
          {
              //x和y的三等分间距
              double tmpx = (rx - lx) / 3,tmpy = (ry - ly) / 3;
              //左三等分点 和 右三等分点
              double lmidx=lx+tmpx,rmidx=rx-tmpx,lmidy=ly+tmpy,rmidy=ry-tmpy;
              //左右两点各求一次答案
              double ans1=calc1(lmidx,lmidy) + dis(ax,ay,lmidx,lmidy)/p;
              double ans2=calc1(rmidx,rmidy) + dis(ax,ay,rmidx,rmidy)/p;
              //ans1更小,就是更优,往左收缩区间
              if(ans2 - ans1 > eps) rx = rmidx,ry = rmidy;
              else lx = lmidx,ly = lmidy;
          }
          return calc1(lx,ly) + dis(ax,ay,lx,ly)/p;
      }
      int main(){
      	cin>>ax>>ay>>bx>>by>>cx>>cy>>dx>>dy>>p>>q>>r;
      	
      	printf("%.2lf\n",calc());
      }
    

http://www.kler.cn/news/318702.html

相关文章:

  • request库的使用 | get请求
  • 微软Active Directory:组织身份与访问管理的基石
  • 字符串——String
  • 量子计算如何引发第四次工业革命——解读加来道雄的量子物理观
  • Android平台使用VIA创建语音交互应用
  • 【ArcGIS微课1000例】0122:经纬网、方里网、参考格网绘制案例教程
  • 0基础带你入门Linux之使用
  • 初识C#(一)
  • 2.以太网
  • 毕设基于SSM+Vue3实现设备维修管理系统四:后台框架及基础增删改查功能实现
  • 常见区块链数据模型介绍
  • [leetcode]113_路径总和II_输出所有路径
  • 【AIGC】ChatGPT RAG提取文档内容,高效制作PPT、论文
  • day-59 四数之和
  • 【React】(推荐项目)使用 React、Socket.io、Nodejs、Redux-Toolkit、MongoDB 构建聊天应用程序 (2024)
  • 数据集-目标检测系列-海洋鱼类检测数据集 fish>> DataBall
  • short-link笔记
  • ubuntu 24.04 输入设备显示没有,系统没有找到电脑麦克风
  • web平台搭建-LAMP(CentOS-7)
  • 【自动驾驶】基于车辆几何模型的横向控制算法 | Stanley 算法详解与编程实现
  • ai写论文哪个平台好?分享4款ai论文写作平台软件
  • Python范例总结
  • 【计算机视觉】YoloV8-训练与测试教程
  • javascript是什么语言?它是干什么的?
  • Element UI在工程中使用方式
  • 79、Python之鸭子类型:没有听过鸭子类型?关键在于认知的转变
  • 网络安全-长亭雷池waf的sql绕过,安全狗绕过(5种绕过3+2)
  • 安科瑞Acrel-1000DP分布式光伏监控系统在鄂尔多斯市鄂托克旗巴音乌苏六保煤矿5MW分布式光伏项目中的应用
  • [linux][证书]证书导出公钥
  • MySQL记录存储过程执行的错误信息