posts - 225, comments - 62, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

ZJU1104

Posted on 2006-09-10 01:38 魔のkyo 阅读(324) 评论(0)  编辑 收藏 引用 所属分类: Programming

//这题我试sample output的时候精度不够,差了0.01,修改了好多细节还是差0.01,试着提交居然一下就过了
//算法还有一些不足,paowuxian workout(point a,point b)中没有判断是否和(0,0)三点共线的问题
//但是if(Vec[i]>pwx)可以避免掉a是x轴上的点(注释1处)

#include <iostream>
#include <vector>
#include <cmath>
#include <stdlib.h>

#define PI 3.141592653589793238
using namespace std;

//过原点的抛物线y=ax^2+bx
class paowuxian{
public:
    double a;
    double b;
};   

class point{
public:
    double x;
    double y;
};

//返回过原点,点a,点b,的抛物线
//前提条件:三点不共线
paowuxian workout(point a,point b)
{
    paowuxian res;
    double a11,a12,a21,a22,b1,b2;
    a11=a.x*a.x;
    a12=a.x;
    a21=b.x*b.x;
    a22=b.x;
    b1=a.y;
    b2=b.y;
    res.a=(b1*a22-b2*a12)/(a11*a22-a21*a12);
    res.b=(a11*b2-a21*b1)/(a11*a22-a21*a12);
    return res;
}   

//点p_a在抛物线pwx上方时返回真  
bool operator > (point p_a,paowuxian pwx)
{
    return (p_a.y > (pwx.a*p_a.x+pwx.b)*p_a.x);
}   

int main()
{
    int n;
   vector<point> Vec;
   while(scanf("%d",&n)!=EOF){
       point point_tmp;
       point_tmp.x=point_tmp.y=0.0;
       paowuxian pwx;
       Vec.clear();

       //把点压入动态数组
       for(int i=0;i<n;++i){
           double y,dx;
           scanf("%lf %lf",&y,&dx);
           point_tmp.y=y;
           Vec.push_back(point_tmp);//这里会取到一些显然不必要的点,有待改进
           point_tmp.x+=dx;
           Vec.push_back(point_tmp);
       }
      
       //为抛物线赋初值
       //pwx=workout(Vec.front(),Vec.back());
       pwx=workout(Vec[1],Vec.back());//目前Vec[0]是x轴上的点不能取,改进后需修改
      
       //如果有点在当前抛物线上方,则重新计算抛物线,最终包含所有点在下方
       for(int i=1;i<Vec.size()-1;i++){
           if(Vec[i]>pwx){//注释1
               pwx=workout(Vec[i],Vec.back());
           }   
       }
       //printf("%lf,%lf\n",pwx.a,pwx.b);
       point highest;//抛物线顶点
       highest.x=Vec.back().x/2;
       highest.y=highest.x*(highest.x*pwx.a+pwx.b);
       double angle_r,angle_d;//仰角的弧度表示和角度表示
       angle_r=atan(highest.y*2/highest.x);
       angle_d=angle_r*180/PI;
       //printf("%.2lf\n",angle);
       double vx,vy,velocity;
       vy=sqrt(2.0*9.8*highest.y);
       velocity=vy/sin(angle_r);
       printf("%.2lf %.2lf\n",angle_d,velocity);
   }
  return 0;
}

 

只有注册用户登录后才能发表评论。