题目描述

在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgww想从A点走到D点,他想知道最少需要走多长时间。

题解

首先要吐槽一下数据,不。。应该是我sadiao了。。。qwq没有想到有两个点重合在一起就炸掉的情况。
很多人都用了SA过的,但是三分更好写,个人感觉。
非常容易可以得出,我们的答案分成3个部分,在线段ab,平面内和线段cd上。
\[ans=min(\frac{dis(a,b)}{p}+\frac{dis(e,f)}{q}+\frac{dis(f,d)}{r})\]
以上式子中的e和f就是在线段ab和线段cd上的某一个点,这个答案就是最小的。
首先,很多人好像不知道怎么三分,其实比较简单,将线段x和y坐标都三等分。。
将e这个点当做一个定点,这样可以三分出e当前的最优的f点的答案。再对e三分。
三分套三分,代码还算简单。细节需要注意一下。

代码

#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
#define db double
using namespace std;
const double eps = 1e-8;
db ax, ay, bx, by, cx, cy, dx, dy, p, q, r;
template <typename T>
T sqr(T x) {
    return x * x;
}
db dist(db x1, db y1, db x2, db y2) {
    return sqrt(sqr(x1 - x2) + sqr(y1 - y2));
}
db calc(db x, db y) {
    db lx = cx, ly = cy, rx = dx, ry = dy;
    while (dist(lx, ly, rx, ry) > eps) {
        db Dx = (rx - lx) / 3.0, Dy = (ry - ly) / 3.0;
        db midlx = lx + Dx, midly = ly + Dy, midrx = rx - Dx, midry = ry - Dy;
        db tmp1 = (dist(x, y, midlx, midly) / r) + (dist(dx, dy, midlx, midly) / q), tmp2 = (dist(x, y, midrx, midry) / r) + (dist(dx, dy, midrx, midry) / q);
        if (tmp2 - tmp1 > eps) rx = midrx, ry = midry;
        else lx = midlx, ly = midly;
    }
    return (dist(x, y, lx, ly) / r) + (dist(dx, dy, lx, ly) / q);
}
int main() {
    scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &ax, &ay, &bx, &by, &cx, &cy, &dx, &dy, &p, &q, &r);
    db lx = ax, ly = ay, rx = bx, ry = by;
    while (dist(lx, ly, rx, ry) > eps) {
        db Dx = (rx - lx) / 3.0, Dy = (ry - ly) / 3.0;
        db midlx = lx + Dx, midly = ly + Dy, midrx = rx - Dx, midry = ry - Dy;
        db tmp1 = calc(midlx, midly) + (dist(ax, ay, midlx, midly) / p), tmp2 = calc(midrx, midry) + (dist(ax, ay, midrx, midry) / p);
        if (tmp2 - tmp1 > eps) rx = midrx, ry = midry;
        else lx = midlx, ly = midly;
    }
    printf("%.2lf\n", calc(lx, ly) + dist(ax, ay, lx, ly) / p);
    return 0;
}

最新文章

  1. matlab画柱状图
  2. 使用windows crypt API解析X509证书
  3. 免费SSL证书Let’s Encrypt
  4. 编写高质量JS代码的68个有效方法(七)
  5. c#反射获取常量属性名以及其值(真正可用)
  6. Button未设type属性时在非IE6/7中具有submit特性
  7. js方式清空表单数据的两种方式
  8. Maven中&lt;dependencies&gt;节点和&lt;dependencyManagement&gt;节点的区别 转
  9. LIST 和 MAP
  10. Mybatis的if test字符串比较问题
  11. JOSN学习总结&lt;二&gt; JSON的格式与语法
  12. netbean7.4 保存远程项目的时候老是跳警告框的解决方案
  13. Android PackageInstaller 安装和卸载
  14. springmvc3.1.1+hibernate4
  15. Python-10 字典dict
  16. micropython驱动sh1106点亮oled
  17. unittest中更高效的执行测试用例一个类只需要打开一次浏览器
  18. Django开发密码管理表实例【附源码】
  19. ios开发之--搜索框的使用(PYSearchViewController的使用)
  20. Servlet----------用servlet写一个“网站访问量统计“的小案例

热门文章

  1. Git push提交时报错Permission denied(publickey)...Please make sure you have the correct access rights and the repository exists.
  2. 封装day.js
  3. [转帖]mimikatz 学习
  4. java语句中的重定向函数
  5. Day3-1 函数
  6. C# Note30: 网络爬虫
  7. MBG逆向工程报错:generate failed: Exception getting JDBC Driver: com.mysql.jdbc.Driver
  8. 关于IWMS中遇到的问题及解决方法
  9. 剖析插件 DataTable 自定义列表列get请求如何书写传递的参数
  10. Python——glob模块