2022牛客多校1 D Mocha and Railgun

题意

https://ac.nowcoder.com/acm/contest/33186/D

在圆内有一条固定中点可以旋转的定长线段,问投影在线段上的圆弧最长有多长

解法

投影之后会产生一个直角三角形,其中一条直角边等于线段长度,斜边为对应圆弧的弦(也可能没有三角形,此时弦等于线段长度)

无论如何投影,都可以先将线段投影到直径上再投影到圆上,因此,可视为线段中点在直径上活动,活动范围是圆心到线段中点本身的位置,这样永远沿着垂直于直径的方向投影。

随着线段中点离圆心越来越远,投影的弧也越来越长(画图易知),因此最远的时候就是答案

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#define ll long long
#define gc getchar
#define maxn 100005
using namespace std;

inline ll read(){
	ll a=0;int f=0;char p=gc();
	while(!isdigit(p)){f|=p=='-';p=gc();}
	while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
	return f?-a:a;
}ll t,r,x,y,d;
double y_1,y_2,wei,xian;

int main(){
	t=read();
	while(t--){
		r=read();x=read();y=read();d=read();
		wei=sqrt(1.0*x*x+y*y);
		y_1=sqrt(1.0*r*r-(wei-d)*(wei-d));
		y_2=sqrt(1.0*r*r-(wei+d)*(wei+d));
		xian=sqrt(4*d*d+(y_2-y_1)*(y_2-y_1));
		printf("%.12lf\n",2*asin(xian/(2*r))*r);
	}
	return 0;
}
posted @ 2022-07-18 20:44  子谦。  阅读(81)  评论(0)    收藏  举报
Live2D
//雪