链接

题目描述

As a world-famous traveler, Prof. Pang’s research interest is to travel as many places as possible in his life.

We have a segment [0,n]{[0, n]}[0,n]. There are two travelers on it. The first one is on position p1p_1p1​ with velocity v1v_1v1​ (which means s/he can walk v1v_1v1​ unit on the segment per second). The second one is on position p2p_2p2​ with velocity v2v_2v2​ .

From their respective beginning points, travelers can walk on the segment. They cannot walk outside the segment. Whenever they want to change their direction, they can turn around immediately.

Please help Prof. Pang to calculate the minimum possible time by which every position of the segment is passed by at least one traveler.

输入描述:

The first line contains one integer test(1≤test≤10000)~(1\le test\le 10000) (1≤test≤10000) – the number of test cases.

The i-th of the next test lines contains five numbers n,p1,i,v1,i,p2,i,v2,in, p_{1, i}, v_{1, i}, p_{2, i}, v_{2, i}n,p1,i​,v1,i​,p2,i​,v2,i​ (0<n≤10000,0≤p1,i,p2,i≤n(0 < n \le 10000, 0\le p_{1, i},p_{2, i} \le n(0<n≤10000,0≤p1,i​,p2,i​≤n, 0.001≤v1,i,v2,i≤10000.001 \le v_{1, i},v_{2, i} \le 10000.001≤v1,i​,v2,i​≤1000. All numbers have at most 333 digits after the decimal point.

输出描述:

For each test case, we should output one number – the minimum time that every position of the segment is passed by at least one traveler.

Your answer is considered correct if its absolute or relative error does not exceed 10−610^{-6}10−6.

输入

2
10000.0 1.0 0.001 9999.0 0.001
4306.063 4079.874 0.607 1033.423 0.847

输出

5001000.0000000000
3827.8370013755

思路

只有三种情况:

  1. 一个人跑完全程
  2. 左边的人走到右端,右边的人走到左端

  1. 取 p1p1p1、p2p2p2 中间某个点 midmidmid ,左边的人走区间 [0,mid][0,mid][0,mid] ,右边的人走[mid,n]

前两种方法比较好计算。第三种方法可以用二分或者三分确定分割位置,从而计算出结果。

三分方法
在最优的分割点处,总时间最小;越是偏离最优点,总时间越长。单峰函数用三分确定极值。

二分方法
暂定一个分割点,计算左边的人用时 t1t1t1 与右边的人用时 t2t2t2,若左边的人用时更久,那么分割点左移,否则分割点右移。

三分代码

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-10;
const double eeps=1e-11;
int T;
double n,a,b,va,vb,ans;double calc(double l,double r,double p,double v){double mn=min(r-p,p-l);return (mn+r-l)/v;
}double f(double p){return max(calc(0,p,a,va),calc(p,n,b,vb));
}void solve(){cin>>n>>a>>va>>b>>vb;if(a>b) swap(a,b),swap(va,vb);double l=a,r=b;while(r-l>eps){double mid=(l+r)/2;double midl=mid-eeps;double midr=mid+eeps;if(f(midl)>f(midr)) l=midl;else r=midr;}ans=f(l);      //情况(3)ans=min(ans,calc(0,n,a,va));    //情况(1)ans=min(ans,calc(0,n,b,vb));    //情况(1)ans=min(ans,max(calc(a,n,a,va),calc(0,b,b,vb)));    //情况(2)cout<<setprecision(10)<<fixed<<ans<<"\n";
}int main(){for(cin>>T;T;T--) solve();
}

其中 double f(double p); 函数的功能为:返回 [0,p][0,p][0,p] 区间全部由 aaa 走完,[p,n][p,n][p,n] 区间全部由 bbb 走完,所用的最小时间。
double calc(double l,double r,double p,double v); 的功能是:返回当初始位置在 ppp ,速度为 vvv ,走完 [l,r][l,r][l,r] 区间所用的最小时间。其中 p∈[l,r]p \in [l,r]p∈[l,r]。

二分代码

#include<bits/stdc++.h>
#define double long double
using namespace std;
int T;
double n,a,b,va,vb,ans;double calc(double l,double r,double p,double v){double mn=min(r-p,p-l);return (mn+r-l)/v;
}double f(double p){return max(calc(0,p,a,va),calc(p,n,b,vb));
}bool check(double p){return calc(0,p,a,va)<calc(p,n,b,vb);
}void solve(){cin>>n>>a>>va>>b>>vb;if(a>b) swap(a,b),swap(va,vb);double l=a,r=b;for(int i=0;i<100;i++){double mid=(l+r)/2;if(check(mid)) l=mid;else r=mid;}ans=f(l);ans=min(ans,calc(0,n,a,va));ans=min(ans,calc(0,n,b,vb));ans=min(ans,max(calc(a,n,a,va),calc(0,b,b,vb)));cout<<setprecision(10)<<fixed<<ans<<"\n";
}int main(){for(cin>>T;T;T--) solve();
}

固定二分次数 100100100 次,有着非常高的精度。

2020ICPC上海 D Walker(思维、二分、三分)相关推荐

  1. 2020icpc上海(重温经典)

    2020icpc上海(重温经典) 导语 涉及的知识点 题目 B D G H I M 参考文献 导语 涉及的知识点 思维,几何,搜索 链接:第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海 ...

  2. 2020ICPC(上海) - Walker(分类讨论+二分)

    题目链接:点击查看 题目大意:在长度为 n 的数轴上给出两个人的初始位置和速度,问使得每个位置至少被一个人走过的时间是多少 题目分析:分类讨论题目,分四种情况讨论即可,设 p1 < p2: p1 ...

  3. 2020icpc上海 Mine Sweeper II (思维)

    题目链接:B-Mine Sweeper II_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海) (nowcoder.com)a 题目大意:给你两个大小为 n * m 的扫雷图 A, B ...

  4. 2020ICPC上海 B Mine Sweeper II(思维)

    链接 题目描述 A mine-sweeper map X {X} X can be expressed as an n × m n\times m n×m grid. Each cell of the ...

  5. 2020ICPC上海 B.Mine Sweeper II(思维,乱搞)

    题意: 扫雷,给你A,B图.权值为所有非雷点的和,要求你修改B图中不超过(n*m/2)个点,使得A,B图权值相等. 思路: 感觉过的太多了,肯定不难.模拟发现,每个点变化值1,2,3,4-都有,所以大 ...

  6. uva 1463 - Largest Empty Circle on a Segment(二分+三分+几何)

    题目链接:uva 1463 - Largest Empty Circle on a Segment 二分半径,对于每一个半径,用三分求出线段到线段的最短距离,依据最短距离能够确定当前R下每条线段在[0 ...

  7. 牛客算法課 (算法入門班) 二分, 三分, 01分數規劃

    目录 NC19916[CQOI2010] 撲克牌 NC116564 [NOIP2012]借教室 K-th Number 三分思路 圆覆盖问题 传送带 01分数规划 小咪买东西 [USACO 2009 ...

  8. CodeForces - 51C 修信号站_思维+二分答案

    题目 给你x轴上的n个点,可以用三段相同长度的区间进行覆盖,问你这三个区间的最小长度是多少,并输出三段区间的中点. 求解 前半个问题应该不难,直接二分答案即可,后半个问题则有些思维成分.另外,这题让我 ...

  9. 2020牛客寒假算法基础集训营5:B.牛牛战队的比赛地(二分/三分)

    整理的算法模板:ACM算法模板总结(分类详细版) 链接:https://ac.nowcoder.com/acm/contest/3006/B 来源:牛客网 题目描述 由于牛牛战队经常要外出比赛,因此在 ...

最新文章

  1. linux c 结构体初始化的四种方法
  2. leetcode 695. Max Area of Island | 695. 岛屿的最大面积(DFS)
  3. [ARC074C] RGB Sequence(dp)
  4. 输出以下图案菱形7行_春夏格子图案超流行,三木的一款格子连衣裙,带来田园少女风...
  5. 哲学到编程:思想的实例化
  6. java导出pdf_一张PDF了解JDK11 GC调优秘籍-附PDF下载
  7. NameError: name ‘os‘ is not defined - 解决
  8. Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones
  9. Ibeacon一维小项目
  10. 网络文件存储系统(三)fastdfs分布式文件系统实战
  11. nginx 服务器大文件上传时500错误
  12. Android中的多点触摸
  13. 真的无语,MSRA连国防七子及北邮学生都不招了
  14. 几天时间【免费】搭建了自己的个人博客,免租服务器,免买域名,真香警告。
  15. 前端JS表格打印和导出
  16. 从《流浪地球》撤资?——“数据思维”害的
  17. Shell编程 Case 和 函数的小练习
  18. 武汉大学数字化设计与仿真考研成功上岸经验分享
  19. python正则表达式两个条件_python高级正则表达式
  20. linux ctrl z 的区别,linux中ctrl+z和ctrl+c的区别

热门文章

  1. SSM框架+layui前端框架整合
  2. apache php 调优_性能优化之PHP优化
  3. iso 8601 php,PHP-使用ISO 8601显示实际时间
  4. springboot 曰志自定义logback配置
  5. Maven的入门到精通系列(制作不易,望支持)
  6. 23套高质量PPT模板—培训课件主题
  7. 【谷粒学院】阿里云视频点播VOD功能笔记
  8. Android 蓝牙技术(一)- 经典蓝牙
  9. c++实现软光栅(二)实现立方体的绘制几个视图矩阵变换投影矩阵推导
  10. ios 设备获取idfa_获取iOS设备唯一标示UUID