HFUT 1356.转啊转(安徽省2016“京胜杯”程序设计大赛 E)
转啊转
Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 25 Accepted: 8
Description
在二维平面上,有一个固定的圆和一个固定的点(保证该点不在圆上),还有一个动点在圆上以角速度w绕圆心一直转。在t时刻,连接该动点与定点成一条直线k,求直线k被圆所截线段的长度(即直线k在圆内部分长度)。动点初始时刻在圆的三点钟方向(即与x轴正方向平行),并以逆时针方向绕圆转。
Input
先输入一个整数T,表示T(T<50)组数据。
每组数据一行七个实数a,b,r(r>0),x,y,w(w>=0),t(t>=0) 分别表示圆的圆心坐标(a,b),半径r,固定点坐标(x,y),角速度w,要查询的时刻t。
上述所有数据的绝对值小于10000。
Output
输出答案占一行,保留2位小数。
Sample Input
1
1 1 1 3 1 3 0
Sample Output
2.00
Hint
角速度定义:
一个以弧度为单位的圆(一个圆周为2π,即:360度=2π),在单位时间内所走的弧度即为角速度。
纯粹的数学问题。
使用两点式、点到直线距离公式、勾股定理求解即可
要注意的是
double输入用%lf 输出用%f
不然会有奇妙的问题出现
AC代码:GitHub
1 /* 2 By:OhYee 3 Github:OhYee 4 HomePage:http://www.oyohyee.com 5 Email:oyohyee@oyohyee.com 6 Blog:http://www.cnblogs.com/ohyee/ 7 8 かしこいかわいい? 9 エリーチカ! 10 要写出来Хорошо的代码哦~ 11 */ 12 13 #include <cstdio> 14 #include <algorithm> 15 #include <cstring> 16 #include <cmath> 17 #include <string> 18 #include <iostream> 19 #include <vector> 20 #include <list> 21 #include <queue> 22 #include <stack> 23 #include <map> 24 using namespace std; 25 26 //DEBUG MODE 27 #define debug 0 28 29 //循环 30 #define REP(n) for(int o=0;o<n;o++) 31 32 const double PI = 3.1415926; 33 34 void Do() { 35 double a,b,r,x,y,w,t; 36 scanf("%lf%lf%lf%lf%lf%lf%lf",&a,&b,&r,&x,&y,&w,&t); 37 38 double xb = a + r * cos(w*t); 39 double yb = b + r * sin(w*t); 40 41 double A = y - yb; 42 double B = xb - x; 43 double C = x * yb - xb * y; 44 45 double l = abs(A * a + B * b + C) / sqrt(A * A + B * B); 46 47 double ans = 2 * sqrt(r * r - l * l); 48 49 printf("%.2f\n",abs(ans)); 50 } 51 52 int main() { 53 int T; 54 scanf("%d",&T); 55 while(T--) 56 Do(); 57 return 0; 58 }
然而,我并不能保证我说的是对的。请自行验证,如有错误,请指正
新博客地址
https://www.oyohyee.com
https://www.oyohyee.com