YahAHa 是虎纠大学的学生。作为 HJU-ACM 的队员,他每天要从生活区走到实验室参加训练。
HJU 的教学楼群大体上是以图书馆中心为圆心,呈若干个同心圆的分布。
经过测量,YahAHa 发现,生活区和实验室都位于半径为 RR 的大道上;从图书馆到大道上一共有 nn 条同心圆小道,他们的半径分别为 r1r1 到 rnrn 。YahAHa 可以在任意同心圆小道上,顺时针或逆时针地绕着小道行走。
此外,HJU 的教学楼群中,有两条大道分别从图书馆直通生活区和实验室。直通生活区的那条大道绕图书馆逆时针旋转 θθ 的弧度即和直通实验室的大道重合。
现在,每天准时上班的 YahAHa 想知道,他从生活区出发前往实验室,最短的路程是多长呢?
Input
第一行输入一个整数 n(1≤n≤105)n(1≤n≤105) 和两个实数 R,θ(0<R≤109,0≤θ<2π)R,θ(0<R≤109,0≤θ<2π)。
第二行输入 nn 个实数 ri(0<ri≤R)ri(0<ri≤R)。
数据保证上述的所有实数都是 66 位小数。
Output
输出一个实数,表示答案。
若你的答案为 aa 而正确答案为 bb ,则当且仅当相对误差或绝对误差不超过 10−310−3 时,你的答案会被认为是正确的。
即当且仅当下述公式满足时,你的答案被认为是正确的:
Sample 1
Inputcopy | Outputcopy |
---|---|
2 2.000000 1.570796 1.000000 0.500000 | 3.141592 |
Note
样例如图所示:
图中灰色部分表示不可通行的教学楼群,橙色部分为可通行的大道、同心圆小道。
YahAHa 需要从图片正下方的生活区走向图片正右方的实验室;图中白色虚线部分表示两条可能的路程。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double p[100010];
int main()
{
int n;
double r,r1,r2,o;
double pi=acos(-1);
cin>>n>>r>>o;
if(o>pi) o=(2*pi-o);
o=(o/(2*pi))*360.0;
// cout<<"pi: "<<pi<<endl;
// cout<<"o: "<<o<<endl;
double sum=0.0;
for(int i=1;i<=n;i++)
{
double x;cin>>x;
double ace=(r-x)*2+(o*pi*x)/180.0;
if(i==1) sum=ace;
else sum=min(ace,sum);
}
double cnt;
cnt=(o*pi*r)/180.0;
sum=min(sum,cnt);
printf("%.06lf",sum);
return 0;
}