[luogu2571][bzoj1857][SCOI2010]传送门【三分套三分】
题目描述
在一个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;
}
[luogu2571][bzoj1857][SCOI2010]传送门【三分套三分】的更多相关文章
- 【BZOJ1857】[Scoi2010]传送带 三分套三分
[BZOJ1857][Scoi2010]传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度 ...
- 2018.06.30 BZOJ1857: [Scoi2010]传送带(三分套三分)
1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MB Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段 ...
- bzoj1857: [Scoi2010]传送带--三分套三分
三分套三分模板 貌似只要是单峰函数就可以用三分求解 #include<stdio.h> #include<string.h> #include<algorithm> ...
- 【BZOJ-1857】传送带 三分套三分
1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 1077 Solved: 575[Submit][Status][ ...
- Bzoj 1857: [Scoi2010]传送带(三分套三分)
1857: [Scoi2010]传送带 Time Limit: 1 Sec Memory Limit: 64 MB Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段 ...
- 【BZOJ1857】传送带(分治经典:三分套三分)
点此看题面 大致题意: 一个二维平面上有两条传送带\(AB\)和\(CD\),\(AB\)传送带的移动速度为\(P\),\(CD\)传送带的移动速度为\(Q\),步行速度为\(R\),问你从\(A\) ...
- BZOJ 1857 传送带 (三分套三分)
在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从 ...
- 三分套三分 --- HDU 3400 Line belt
Line belt Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3400 Mean: 给出两条平行的线段AB, CD,然后一 ...
- loj10017. 「一本通 1.2 练习 4」传送带(三分套三分)
题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxh ...
随机推荐
- Shell脚本1
1Shell编程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell脚本 Shell 脚本(shell scr ...
- 多线程系列之四:Guarded Suspension 模式
一,什么是Guarded Suspension模式如果执行现在的处理会造成问题,就让执行处理的线程等待.这种模式通过让线程等待来保证实例的安全性 二,实现一个简单的线程间通信的例子 一个线程(Clie ...
- chrome extensions notifications
developer.chrome.comhttps://developer.chrome.com/extensions/notifications notification | MDNhttps:// ...
- Leaf——美团点评分布式ID生成系统 UUID & 类snowflake
Leaf——美团点评分布式ID生成系统 https://tech.meituan.com/MT_Leaf.html
- rem移动端适配方案
一. rem vs em 单位 定义 特点 rem font size of the root element 以根元素字体大小为基准 em font size of the element 以父元素 ...
- [转帖]web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。
web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全. https://www.cnblogs.com/1996V/p/7458377.html 感谢原作者写的内容 安全 ...
- Oracle创建'数据库'三步走
--创建表空间 create tablespace waterboss datafile 'd:\waterboss.dbf' size 100m autoextend on next 10m; -- ...
- java回调机制——基本理解
回调(diao):往回调用,反向调用. 英文 call back.call:调用,back:返回,往返. 回调的意思就是杀个回马枪...... 回调(callback),既然是往回调用,那自然有一个正 ...
- 结巴(jieba)分词
一.介绍: jieba: “结巴”中文分词:做最好的 Python 中文分词组件 “Jieba” (Chinese for “to stutter”) Chinese text segmentatio ...
- kprobe原理解析
参考 http://www.cnblogs.com/honpey/p/4575928.html kprobe是linux内核的一个重要特性,是一个轻量级的内核调试工具,同时它又是其他一些更高级的内核 ...