- /**
- * 由于抛物线经过点(0,0), (D, 0),设抛物线方程为 y = -Ax(x-D), 其中(D, 0)为落地点。
- * 再由参数方程 x = v0*t*cosO
- y = -0.5*g*t^2 + v0*t*sin0
- 消去参数得 y = -[g/(2*v0^2*cos0^2)]*x^2 + tan0 *x
- 与前面方程比较得 AD = tan0, v0 = sqrt( g*cos0*cos0/(2*A) ).
- 所以, 只要求得 A就可以了。
- 对每个建筑物的两个最高点, 检验通过该点的形如 y = -Ax(x-D)的抛物线是否会碰到其他建筑物,
- 在不会碰到其他建筑物的抛物线中, 取height最小的。
- *
- *
- **/
- #include <iostream>
- #include <cmath>
- #include <cstdlib>
- using namespace std;
- const double EP = 1E-10;
- const double INF = 1E200;
- const double PI = 3.1415926;
- int main()
- {
- int n;
- double d[100], h[100], x[200], y[200], D = 0, A;
- double a, yy;
- bool fine = true;
- while (cin>>n, cin.get() != EOF)
- {
- D = 0;
- for (int i=0; i<n; i++)
- {
- cin>>h[i]>>d[i];
- D += d[i];
- }
- x[0] = x[1] = 0;
- n *= 2;
- //计算出2n个最高点
- for (int i=2; i<n; i+=2)
- {
- x[i] = x[i-2] + d[i/2-1];
- x[i+1] = x[i] + d[i/2];
- y[i] = y[i+1] = h[i/2];
- }
- a=INF;
- for (int i=2; i<n-2; i++)
- {
- fine = true;
- A = y[i]/((D - x[i])*x[i]);
- for (int j=2; j<n-2; j++)
- {
- //yy为在当前抛物线在x[i]处的高度, 若它比
- //该处建筑物矮, 则舍弃当前抛物线
- yy = A*x[j]*(D-x[j]);
- if ( yy < y[j] )
- {
- fine = false;
- break;
- }
- }
- if (fine && a > A) {
- a = A;
- }
- }
- double theta = atan(a*D);
- double angle = 180*theta/PI;
- double v0 = sqrt(4.9*(1+a*D*a*D)/a);
- printf("%.2f %.2f/n",angle, v0);
- }
- }
zoj 1104
最新推荐文章于 2017-04-25 00:53:27 发布