博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cf595d
阅读量:6717 次
发布时间:2019-06-25

本文共 2231 字,大约阅读时间需要 7 分钟。

题意:给出一个轮子,上面有一个随着它转动的传感器在圆周上,给出一个指定距离m,和轮子向前行进的速度v以及轮子的半径r。问让传感器通过该距离最少需要多少时间。

分析:首先我们列出传感器行进距离与时间的轮子行进距离的关系:f(c) = c+r*sin(c/r)。其中c是距离,r是半径。该公式表示传感器从轮子正上方开始运行索性进的距离。

我们可以先去除一种情况,就是距离m是直径2r的整数倍,那么传感器在开始点和结束点所处的角度是相同的,无论从哪个角度开始所需的时间都是一样的。

我们只考虑非整数倍的情况。

要看传感器行进速度的变化,我们需要对这个函数f关于c进行求导。

求得导数是:f'(c) = 1+cos(c/r)。这就是传感器速度的函数。而这个函数图像与x轴所夹的面积就是行进距离。

那么,我们现在的任务就变成了在这个图像上截取一段,使得与x轴所夹的面积是m,且要保证我们截取的横向长度最短。(因为速度是一定的,距离和时间成正比)

假设我们截取了x=a到x=b。那么一定有f'(a)=f'(b)。如果两者不等,例如f'(a)<f'(b),我只要将右边缘向右平移一点点,保证面积不变的话,就需要将左边缘向右平移更多。

因为我们如果把这个增量看成小长方体,如果左右平移量相等,f'(a)<f'(b)导致右边进来的就比左边进来的长方体高,那面积就变了。

既然f'(a)=f'(b),就一定a在图像的递增区域,b在递减区域,否则还会出现上面的情况,或者就是m是2r的整数倍。

也就是说两边缘必须对称,也就是说选区的中间是最高点或者最低点。我们只需要对两种情况分别进行二分查找即可。

二分查找的时候查找轮子的行进长度,每次观察f(c)>=m/2是否成立。

 

二分查找有个需要特别注意的地方。如果每次只是限定L和R的差值是不行的。差值设大了就会出现WA,设小了会TLE。

需要限定二分迭代的次数为50次左右。不知道是不是其他的比赛或者OJ也有这种情况。

#include 
#include
#include
using namespace std;#define d(x) #define zero(x) (((x)>0?(x):-(x))
0 ? 1 : -1;}int n, radius, v;int dist;bool top_ok(double bike_dist){ double ret = bike_dist + radius * sin(bike_dist / radius); return double_cmp(ret * 2.0 - dist) >= 0;}bool bottom_ok(double bike_dist){ double ret = bike_dist - radius * sin(bike_dist / radius); return double_cmp(ret * 2.0 - dist) >= 0;}double binary_search(bool (*ok)(double)){ double l = max(0.0, dist / 2.0 - 2 * radius); double r = dist / 2.0 + 2 * radius; int cnt = 0; while (double_cmp(r - l) > 0) { double mid = (l + r) / 2; if (ok(mid)) r = mid; else l = mid; cnt++; if (cnt > 100) break; } d(printf("%.2f\n", l / radius / 2 / 3.14)); return l;}double work(){ double time_top = binary_search(&top_ok) / v; double time_bottom = binary_search(&bottom_ok) / v; d(printf("%.2f %.2f\n", time_top, time_bottom)); return min(time_top, time_bottom) * 2;}int main(){ scanf("%d", &n); scanf("%d%d", &radius, &v); for (int i = 0; i < n; i++) { int a, b; scanf("%d%d", &a, &b); dist = b - a; printf("%.12f\n", work()); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/rainydays/p/5060198.html

你可能感兴趣的文章
无人机新用途,可精确识别危险海洋生物并向游泳者发出预警
查看>>
(一) virtualenv虚拟环境安装
查看>>
Android官方开发文档Training系列课程中文版:分享简单数据之从其它APP接收简单数据...
查看>>
OpenSSL将于9月22日发布多个漏洞补丁
查看>>
大数据助推新型智库建设
查看>>
新加坡欲重组通信和媒体管制机构
查看>>
《CCNP ROUTE 300-101学习指南》——2.2节构建EIGRP拓扑表
查看>>
Libreboot 项目向开源社区示好和致歉
查看>>
Linux Kernel 4.9-rc8,4.9 分支最后一个候选版
查看>>
《Web异步与实时交互——iframe AJAX WebSocket开发实战》—— 2.2 相关关键技术及工作原理...
查看>>
《Nmap渗透测试指南》—第1章1.5节Mac OS安
查看>>
学习和使用 PHP 应该注意的10件事
查看>>
.NET Framework 源码
查看>>
centos上一键安装jdk、tomcat脚本
查看>>
ArrayList源码分析
查看>>
JS Object的静态方法汇总( 上 )
查看>>
jvm疯狂吞占内存,罪魁祸首是谁?
查看>>
sql server随机函数
查看>>
优朋普乐:OTT正重构电视版图
查看>>
Ubuntu 14.04 LTC 有线网络——网线不识别,灯不亮问题
查看>>