There are many parallel lines on the ground with the distance of D between each adjacent two. Now, throwing a needle randomly on the ground,please calculate the possibility of that the needle can be across one of the lines.
CSU1602: Needle Throwing Game(投针问题)
时间:2015-05-03 20:39:18
收藏:0
阅读:267
Description
Input
The input consists of multiple test cases. Each test case contains 2 integers D, L on a single line (1 <= D, L <= 100). The input is ended with EOF.
Output
For each test case, print an integer of (int)(P*10000) where P is the possibility asked above. For example, when P = 0.25658,you should output 2565.
Sample Input
4 2
2 4
Sample Output
3183
8372
HINT
Source
裸的投针问题,不知道的童鞋可以自己百度,直接公式。。。
对于这种公式题,知道公式与不知道的差别瞬间就体现出来了
#include <iostream> #include <stdio.h> #include <string.h> #include <stack> #include <queue> #include <map> #include <set> #include <vector> #include <math.h> #include <algorithm> using namespace std; #define ls 2*i #define rs 2*i+1 #define up(i,x,y) for(i=x;i<=y;i++) #define down(i,x,y) for(i=x;i>=y;i--) #define mem(a,x) memset(a,x,sizeof(a)) #define w(a) while(a) #define LL long long const double PI = acos(-1.0); #define Len 200005 #define mod 19999997 const int INF = 0x3f3f3f3f; #define exp 1e-8 int main() { double L,D; double P; w(~scanf("%lf%lf",&D,&L)) { if(L<D) P=2*L/(PI*D); else P=1+(2.0/PI)*((L*1.0/D)*(1-sqrt((1-(D*D)/(L*L))))-asin(D*1.0/L)); P=P*10000; printf("%d\n",(int)P); } return 0; }
原文:http://blog.csdn.net/libin56842/article/details/45460843
评论(0)