For months Maxim has been coming to work on his favorite bicycle. And quite recently he decided that he is ready to take part in a cyclists’ competitions.
He knows that this year n competitions will take place. During the i-th competition the participant must as quickly as possible complete a ride along a straight line from point si to point fi (si < fi).
Measuring time is a complex process related to usage of a special sensor and a time counter. Think of the front wheel of a bicycle as a circle of radius r. Let’s neglect the thickness of a tire, the size of the sensor, and all physical effects. The sensor is placed on the rim of the wheel, that is, on some fixed point on a circle of radius r. After that the counter moves just like the chosen point of the circle, i.e. moves forward and rotates around the center of the circle.
At the beginning each participant can choose any point bi, such that his bike is fully behind the starting line, that is, bi < si - r. After that, he starts the movement, instantly accelerates to his maximum speed and at time tsi, when the coordinate of the sensor is equal to the coordinate of the start, the time counter starts. The cyclist makes a complete ride, moving with his maximum speed and at the moment the sensor’s coordinate is equal to the coordinate of the finish (moment of time tfi), the time counter deactivates and records the final time. Thus, the counter records that the participant made a complete ride in time tfi - tsi.
Maxim is good at math and he suspects that the total result doesn’t only depend on his maximum speed v, but also on his choice of the initial point bi. Now Maxim is asking you to calculate for each of n competitions the minimum possible time that can be measured by the time counter. The radius of the wheel of his bike is equal to r.
Input
The first line contains three integers n, r and v (1 ≤ n ≤ 100 000, 1 ≤ r, v ≤ 109) — the number of competitions, the radius of the front wheel of Max’s bike and his maximum speed, respectively.
Next n lines contain the descriptions of the contests. The i-th line contains two integers si and fi (1 ≤ si < fi ≤ 109) — the coordinate of the start and the coordinate of the finish on the i-th competition.
Output
Print n real numbers, the i-th number should be equal to the minimum possible time measured by the time counter. Your answer will be considered correct if its absolute or relative error will not exceed 10 - 6.
Namely: let’s assume that your answer equals a, and the answer of the jury is b. The checker program will consider your answer correct if .
Example
Input
2 1 2
1 10
5 9
Output
3.849644710502
1.106060157705
题意大概就是给出自行车比赛的计时方式,轮胎上的计时器与起点线位于竖直面上开始即时,与终点线位于同一竖直面上时停止计时,所以如图所示。
开始计时的时候,s点到轮胎圆心的水平距离差和停止计时时的距离差就是不参与计时的路程,我们就是需要找到一种策略使得这段不参与计时的路程达到最长,易知(不会证)如图上那种策略时最优的,也就是开始计时时和停止计时的时候计时器是对称的,假设总路长为dist,我们取len=dist减去路程中完全圆周长的长度(dist/(周长)*周长),剩下的就是最后需要走的距离l和节省下来的两段距离s。这里剩下来的距离S等于开始时计时器距离圆心的水平距离*2,所以只要我们找到满足l+s=len的最小的l就行了,这里可知s=r*sin(l / r) ,所以l+s是单调的,我们只要用二分法就能快速找到最小的满足条件的l了。
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
int n, r, v,s,f;
double pai = acos(-1);
int main(){
scanf("%d%d%d", &n, &r, &v);
for (int i = 0; i < n; i++){
scanf("%d%d", &s, &f);
double len = f - s;
double c = pai*r * 2;
int k = len / c;
double ans = k*c / v;
len -= c*k;
len /= 2;
double lef = 0, rig = len;
for (int i = 0; i < 50; i++){
double mid = (lef + rig) / 2;
if (mid + r*sin(mid / r) >= len)rig = mid;
else lef = mid;
}
ans += 2 * lef / v;
printf("%.15lf\n", ans);
}
return 0;
}
本文介绍了一种自行车比赛中的特殊计时策略,通过数学方法计算最佳起点位置以最大化不计时的距离,从而减少比赛计时。使用二分查找法确定最优解。
541

被折叠的 条评论
为什么被折叠?



