题目描述

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

输入输出格式

输入格式:

输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By

第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy

第三行是3个整数,分别是P,Q,R

输出格式:

输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位

输入输出样例

输入样例#1:

0 0 0 100

100 0 100 100

2 2 1

输出样例#1:

136.60

说明

对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000, 1<=P,Q,R<=10


Brave_Cattle sto backup_noob orz Brave_Cattle

backup_noob帮助Brave_Cattle调好了参数让暴力通过了此题.

一句话题意: 一个\(1000*1000\)的矩形中有\(A,B,C,D\)四个点.并且现在你在\(A\)点,要前往\(D\)点,并且在\(AB,CD\)上有传送带,在\(AB\),平地,\(CD\)上的速度分别为P,Q,R.问到达\(D\)的最小时间.


题解: 首先考虑在矩形中行进的路径.如果不走传送带,显然是直接走直线距离最短,如果要走传送带,也是直线上传送带需要走的平地路径最短.那么显然最终走的总距离就是\(A\)->\(AB\)上一点->\(CD\)上一点->\(D\).那么我们可以通过枚举得到\(AB,CD\)上这一点的位置,也就是将\(AB\)看作一个向量,则\(\vec {AP}=k*\vec {AB}, k∈[0,1]\),其中\(P\)为\(AB\)上的位置.因为本题精度要求不高,所以这样枚举是可以过的.

当然这题还有模拟退火,三分等算法.

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const double delta = 2e-4;
const int inf = 2147483647; double ans = inf, P, Q, R; struct point{
double x, y;
}a[10]; inline double dis(point a, point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} inline point get_pos(point a, point b, double k){
point temp; temp.x = (b.x-a.x)*k+a.x, temp.y = (b.y-a.y)*k+a.y;
return (point){ (b.x-a.x)*k+a.x, (b.y-a.y)*k+a.y };
} inline double calc(double i, double j){
point temp1 = get_pos(a[1], a[2], i), temp2 = get_pos(a[3], a[4], j);
return dis(a[1], temp1)/P+dis(temp1, temp2)/R+dis(temp2, a[4])/Q;
} int main(){
// freopen("walk.in", "r", stdin);
// freopen("walk.out", "w", stdout);
cin >> a[1].x >> a[1].y >> a[2].x >> a[2].y >> a[3].x >> a[3].y >> a[4].x >> a[4].y;
cin >> P >> Q >> R;
for(double i=0;i<=1;i+=delta)
for(double j=0;j<=1;j+=delta) ans = min(ans, calc(i, j));
cout << fixed << setprecision(2) << ans << endl;
return 0;
}

当然这题是可以用三分来做的.因为从一条直线到另一条直线的时间满足一个凸函数的性质.可以感性的理解一下:到直线的一端的无穷远的地方需要无限的时间,到另一端无穷远的地方也要无限时间,而到中间一个位置可以使时间最小,所以可以三分.

所以这里可以用一个三分套三分的方法,先三分在\(AB\)段走的长度,再三分在\(CD\)段走的长度.(虽然这里为什么三分套三分仍然是一个凸函数我并不是很懂,但是至少也可以枚举一边走的长度然后三分另一边).大概实现看一下代码吧.

#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-6; double P, Q, R; struct point{
double x, y;
}a[10]; inline double dis(point a, point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} inline point get(point a, point b, double k){
return (point){ (b.x-a.x)*k+a.x, (b.y-a.y)*k+a.y };
} inline double calc(double k1, double k2){
point temp1 = get(a[1], a[2], k1), temp2 = get(a[3], a[4], k2);
return dis(a[1], temp1)/P+dis(temp1, temp2)/R+dis(temp2, a[4])/Q;
} inline double check(double k){
double l = 0, r = 1;
while(r-l > eps){
double p1 = (2*l+r)/3, p2 = (l+2*r)/3;
if(calc(k, p1) > calc(k, p2)) l = p1;
else r = p2;
}
return calc(k, l);
} int main(){
//freopen("data.in", "r", stdin);
cin >> a[1].x >> a[1].y >> a[2].x >> a[2].y;
cin >> a[3].x >> a[3].y >> a[4].x >> a[4].y;
cin >> P >> Q >> R;
double l = 0, r = 1;
while(r-l > eps){
double p1 = (2*l+r)/3, p2 = (l+2*r)/3;
if(check(p1) > check(p2)) l = p1;
else r = p2;
}
cout << fixed << setprecision(2) << check(l) << endl;
return 0;
}

[洛谷P2571] [SCOI2010]传送带的更多相关文章

  1. 【解题报告】洛谷 P2571 [SCOI2010]传送带

    [解题报告]洛谷 P2571 [SCOI2010]传送带今天无聊,很久没有做过题目了,但是又不想做什么太难的题目,所以就用洛谷随机跳题,跳到了一道题目,感觉好像不是太难. [CSDN链接](https ...

  2. 洛谷P2571 [SCOI2010]传送带 [三分]

    题目传送门 传送带 题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移 ...

  3. 洛谷 P2571 [SCOI2010]传送带 题解

    每日一题 day51 打卡 Analysis 这道题是用非常恶心的三分套三分做的,有一个技巧是不要枚举坐标,枚举两条线段构成三角形的相似比就好了. 了解思路就还挺好写的(尽管我还调了三天) #incl ...

  4. P2571 [SCOI2010]传送带

    P2571 [SCOI2010]传送带 三分套三分. 前提条件:P3382 [模板]三分法 三分,求区间内单峰函数的最大/最小值. 我们把两条线段都跑三分,先ab后cd,求出最小值. 可以直接将二维坐 ...

  5. P2571 [SCOI2010]传送带——hyl天梦

    P2571 [SCOI2010]传送带题解----天梦 如写的不好,请多见谅. 对于这道题,我首先想说,确实困惑了我好久,看网上的各种题解,却都不尽人意,思路早已明白,却不会操作.最后想想,还是觉得自 ...

  6. BZOJ1856或洛谷1641 [SCOI2010]生成字符串

    BZOJ原题链接 洛谷原题链接 可以将\(1\)和\(0\)的个数和看成是\(x\)轴坐标,个数差看成\(y\)轴坐标. 向右上角走,即\(x\)轴坐标\(+1\),\(y\)轴坐标\(+1\),表示 ...

  7. BZOJ1855或洛谷2569 [SCOI2010]股票交易

    一道单调队列优化\(DP\) BZOJ原题链接 洛谷原题链接 朴素的\(DP\)方程并不难想. 定义\(f[i][j]\)表示到第\(i\)天,手上持有\(j\)股时的最大收益. 转移方程可以分成四个 ...

  8. 洛谷 P1641 [SCOI2010]生成字符串

    洛谷 这题一看就是卡塔兰数. 因为\(cnt[1] \leq cnt[0]\),很显然的卡塔兰嘛! 平时我们推导卡塔兰是用一个边长为n的正方形推的, 相当于从(0,0)点走到(n,n)点,向上走的步数 ...

  9. 洛谷 P1640 [SCOI2010]连续攻击问题

    洛谷 一句话题意: 每个武器有两种属性,每种武器只能选择一种属性,从属性1连续递增才算攻击,求最大连续攻击次数. 因为同学告诉我这是二分图最大匹配,自然就往那个方向去想. 那么怎么建图呢? 每个武器只 ...

随机推荐

  1. 团队作业7——第二次项目冲刺(Beta版本)

    团队作业7——第二次项目冲刺-Beta版本项目计划 团队作业7——第二次项目冲刺(Beta版本)-第一篇 团队作业7——第二次项目冲刺(Beta版本)-第二篇 团队作业7——第二次项目冲刺(Beta版 ...

  2. JavaScript控制href属性进行钓鱼

    前一阵子,发现JavaScript中允许临时改变<a>标签的href属性,当改变其属性后你点击它可能看不出有多严重,但是,它可以通过欺骗手段来诱骗用户透露他们的详细资料. // Uncom ...

  3. ResultSet 可滚动性和可更新性

    JDBC 2.0 API 为结果集增加了两个新的基本能力:可滚动性和可更新性,我想肯定满足了你的要求.在滚动结果集中可用的方法有: rs.previous();//向前滚动 rs.next();//向 ...

  4. dwarf是怎样处理的栈帧?

    dwarf是如何处理的栈帧呢? 首先看下非dwarf的情况是如何处理栈帧的: 1 3623804982590 0x3e90 [0xb0]: PERF_RECORD_SAMPLE(IP, 0x1): 1 ...

  5. delphi7中 OnDrawColumnCell 事件怎么用

    你问的这个事件应该是dbgrid控件中的吧?这个事件是在grid控件载入数据的时候触发的,至于你这个“怎么用”波及的范围太大了,呵呵!不知道如何说起!另外还是发一段相关的代码吧,这也是我之前提过问题, ...

  6. bzoj3992-序列统计

    给出\(n,m,x,S\),其中\(S\subseteq [0,m)\),问有多少个长度为\(n\)的数列\(a\)使得\(a_i\in S\),并且数列中所有元素的乘积mod \(m\)为\(x\) ...

  7. 安装单机Hadoop系统(完整版)——Mac

    在这个阴雨绵绵的下午,没有睡午觉的我带着一双惺忪的眼睛坐在了电脑前,泡上清茶,摸摸已是略显油光的额头(笑cry),,奋斗啊啊啊啊!!%>_<% 1.课程回顾. 1.1 Hadoop系统运行 ...

  8. c++【1】

    高考完了,重新做码农.要转c++. 按照粉书什么的.果然要告别p党了呢. 第一部分 语言篇 第一章:程序输入 主要是一些输入输出格式. #include<cstdio> 输出: print ...

  9. URAL.1033 Labyrinth (DFS)

    URAL.1033 Labyrinth (DFS) 题意分析 WA了好几发,其实是个简单地DFS.意外发现这个俄国OJ,然后发现ACRUSH把这个OJ刷穿了. 代码总览 #include <io ...

  10. Delight for a Cat

    Time Limit: 1000 ms Memory Limit: 512 MB Description ​ 从前,有一只懒猫叫CJB.每个小时,这只猫要么在睡觉,要么在吃东西,但不能一边睡觉一边吃东 ...