zoj 1104

  1. /**
  2. * 由于抛物线经过点(0,0), (D, 0),设抛物线方程为 y = -Ax(x-D), 其中(D, 0)为落地点。
  3. * 再由参数方程 x = v0*t*cosO
  4.                y = -0.5*g*t^2 + v0*t*sin0
  5.   消去参数得   y = -[g/(2*v0^2*cos0^2)]*x^2 + tan0 *x
  6.   与前面方程比较得 AD = tan0, v0 = sqrt( g*cos0*cos0/(2*A) ).
  7.   所以, 只要求得 A就可以了。
  8.   对每个建筑物的两个最高点, 检验通过该点的形如 y = -Ax(x-D)的抛物线是否会碰到其他建筑物, 
  9.   在不会碰到其他建筑物的抛物线中, 取height最小的。
  10. *
  11. *
  12. **/
  13. #include <iostream>
  14. #include <cmath>
  15. #include <cstdlib>
  16. using namespace std;
  17. const double EP = 1E-10;
  18. const double INF = 1E200;
  19. const double PI = 3.1415926;
  20. int main()
  21. {
  22.     int n;
  23.     double d[100], h[100], x[200], y[200], D = 0, A;
  24.     double a, yy;
  25.     bool fine = true;
  26.     while (cin>>n, cin.get() != EOF)
  27.     {
  28.         D = 0;
  29.         for (int i=0; i<n; i++)
  30.         {
  31.             cin>>h[i]>>d[i];
  32.             D += d[i];
  33.         }
  34.         x[0] = x[1] = 0;
  35.         n *= 2;
  36.         //计算出2n个最高点
  37.         for (int i=2; i<n; i+=2)
  38.         {
  39.             x[i] = x[i-2] + d[i/2-1];
  40.             x[i+1] = x[i] + d[i/2];
  41.             y[i] = y[i+1] = h[i/2];
  42.         }
  43.     
  44.         a=INF;
  45.         for (int i=2; i<n-2; i++)
  46.         {
  47.             fine = true;
  48.             A = y[i]/((D - x[i])*x[i]);
  49.             for (int j=2; j<n-2; j++)
  50.             {
  51.                 //yy为在当前抛物线在x[i]处的高度, 若它比
  52.                 //该处建筑物矮, 则舍弃当前抛物线
  53.                 yy = A*x[j]*(D-x[j]);
  54.                 if ( yy < y[j] )
  55.                 {
  56.                     fine = false;
  57.                     break;
  58.                 }
  59.             }
  60.             if (fine && a > A) {
  61.                 a = A;
  62.             }
  63.         }
  64.         double theta = atan(a*D);
  65.         double angle = 180*theta/PI;
  66.         double v0 = sqrt(4.9*(1+a*D*a*D)/a);
  67.     
  68.         printf("%.2f %.2f/n",angle, v0);
  69.     }
  70. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值