D-Mocha and Railgun
题目
https://ac.nowcoder.com/acm/contest/33186/D
解题
找最长弧
通过几何画板绘图
发现当发射方向垂直于发射点与圆心的连线时,破坏圆弧最长
补个直观证明图,来自雨巨讲题
分类讨论
每个样例给发射点点坐标,发射半径
可求得发射点到圆心的圆心距
当原点在发射半径外时
在三角形上,可求得
在三角形上,可求得
对所求圆弧有
当原点在发射半径内时
在三角形上,可求得
在三角形上,可求得
对所求圆弧有
代码
由上述逻辑得
#include<bits/stdc++.h>
using namespace std;
int T;
int main(){
cin>>T;
double r,x,y,d,L;
while(T--){
cin>>r>>x>>y>>d;
L=sqrt(x*x+y*y);
if(L>d){
printf("%.8lf\n",r*(asin((L+d)/r)-asin((L-d)/r)));
}
else{
printf("%.8lf\n",r*(asin((d+L)/r)+asin((d-L)/r)));
}
}
return 0;
}
然而其实有,故可以化简
#include<bits/stdc++.h>
using namespace std;
int T;
int main(){
cin>>T;
double r,x,y,d,L;
while(T--){
cin>>r>>x>>y>>d;
L=sqrt(x*x+y*y);
printf("%.8lf\n",r*(asin((L+d)/r)-asin((L-d)/r)));
}
return 0;
}