题目描述
在一个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]传送带的更多相关文章
-
【解题报告】洛谷 P2571 [SCOI2010]传送带
[解题报告]洛谷 P2571 [SCOI2010]传送带今天无聊,很久没有做过题目了,但是又不想做什么太难的题目,所以就用洛谷随机跳题,跳到了一道题目,感觉好像不是太难. [CSDN链接](https ...
-
洛谷P2571 [SCOI2010]传送带 [三分]
题目传送门 传送带 题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移 ...
-
洛谷 P2571 [SCOI2010]传送带 题解
每日一题 day51 打卡 Analysis 这道题是用非常恶心的三分套三分做的,有一个技巧是不要枚举坐标,枚举两条线段构成三角形的相似比就好了. 了解思路就还挺好写的(尽管我还调了三天) #incl ...
-
P2571 [SCOI2010]传送带
P2571 [SCOI2010]传送带 三分套三分. 前提条件:P3382 [模板]三分法 三分,求区间内单峰函数的最大/最小值. 我们把两条线段都跑三分,先ab后cd,求出最小值. 可以直接将二维坐 ...
-
P2571 [SCOI2010]传送带——hyl天梦
P2571 [SCOI2010]传送带题解----天梦 如写的不好,请多见谅. 对于这道题,我首先想说,确实困惑了我好久,看网上的各种题解,却都不尽人意,思路早已明白,却不会操作.最后想想,还是觉得自 ...
-
BZOJ1856或洛谷1641 [SCOI2010]生成字符串
BZOJ原题链接 洛谷原题链接 可以将\(1\)和\(0\)的个数和看成是\(x\)轴坐标,个数差看成\(y\)轴坐标. 向右上角走,即\(x\)轴坐标\(+1\),\(y\)轴坐标\(+1\),表示 ...
-
BZOJ1855或洛谷2569 [SCOI2010]股票交易
一道单调队列优化\(DP\) BZOJ原题链接 洛谷原题链接 朴素的\(DP\)方程并不难想. 定义\(f[i][j]\)表示到第\(i\)天,手上持有\(j\)股时的最大收益. 转移方程可以分成四个 ...
-
洛谷 P1641 [SCOI2010]生成字符串
洛谷 这题一看就是卡塔兰数. 因为\(cnt[1] \leq cnt[0]\),很显然的卡塔兰嘛! 平时我们推导卡塔兰是用一个边长为n的正方形推的, 相当于从(0,0)点走到(n,n)点,向上走的步数 ...
-
洛谷 P1640 [SCOI2010]连续攻击问题
洛谷 一句话题意: 每个武器有两种属性,每种武器只能选择一种属性,从属性1连续递增才算攻击,求最大连续攻击次数. 因为同学告诉我这是二分图最大匹配,自然就往那个方向去想. 那么怎么建图呢? 每个武器只 ...
随机推荐
-
中文api接口
http://www.bejson.com/knownjson/webInterface/
-
[fortify] 不安全的函数eregi()
PHP 5.4/5.3弃用函数eregi() memory_limit绕过漏洞 [日期:2012-04-02] 来源:Linux社区 作者:Linux [字体:大 中 小] 发布日期:2012- ...
-
Revit API 楼板开洞
start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] , , ) * / , - ...
-
LUA 协程
LUA协程和C#协程非常相似,功能与用法更强大.基础用法: coco = coroutine.create(function (a,b) print("resume args:". ...
-
动态代理处理service
/* 动态代理处理service * 1.动态代理的核心是切面编程,去除重复代码: * 2.通过反射+注解可以灵活的获取传入对象内容: * 3.通过try+catch将多个操作包裹,实现事物的原子性: ...
-
Angular 2/4/5+ 重复点击菜单刷新界面
记一下,网上没找到方法 自己搞了好久 通过跳转到别的界面在跳回来的方式进行实现 //再次点击刷新界面 if (this.router.url == item.ur ...
-
setjmp/longjmp
1.setjmp/longjmp属于传统的错误处理 2.setjmp/longjmp是对goto语句的补充,goto仅仅能实现局部跳转.setjmp/longjmp能够实现全局跳转 3.setjmp/ ...
-
springcloud-1: 用官方的pom.xml配置添加依赖失败
在eclipse中用STS生成了一个springcloud应用,pom.xml的核心配置如下: <parent> <groupId>org.springframework.bo ...
-
java开发中的常见类和对象-建议阅读时间3分钟
1.Dao 数据访问对象 此对象用于访问数据库.实现类一般用于用于操作数据库! 一般操作修改,添加,删除数据库操作的步骤很相似,就写了一个公共类DAO类 ,修改,添加,删除数据库操作时 直接调用公共类 ...
-
epel [Errno 14] problem making ssl connection
问题描述: 执行yum命令时,报错[Errno 14] problem making ssl connection 问题分析: ssl证书问题 问题解决: sed -i 's/^#baseurl/ba ...