当前位置: 代码迷 >> 综合 >> AOJ 2327 SKY JUMP
  详细解决方案

AOJ 2327 SKY JUMP

热度:77   发布时间:2024-01-12 05:23:59.0

sxbk的数学题

设每个速度向量分配到的时间为ti, 则可以列出方程:

x1t1+x2t2+...+xntn=X.........(1)

y1t1+y2t2+...+yntn-1/2*g*(t1^2+t2^2+...+tn^2)=Y.........(2)

为求出在x=X处最高点Y坐标, 可固定t3至tn, 方程组即化为二元. 令(1)式为约束, 对(2)式两侧求导

发现(t1*g-y1)/x1与(t2*g-y2)/x2的比值恒等

即(ti*g-yi)/xi = (tj*g-yj)/xj

所以二分这个比值p, 可得到最高点y值, 最低点y值可由暴力得到.

易证, 最高点y与最低点y之间都可以由这些速度向量达到


/*author: birdstorm*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define eps 1.0e-8
#define INF 1e50
#define g 4.9
using namespace std;
double X,Y;
int n;
struct G{double x;double y;
};
G d[1010];
double calc(double x)
{double ans=0;for(int i=0;i<n;i++){double t=(x*d[i].x/g+d[i].y/g)/2.0;if(t>0) ans+=t*d[i].x;}return ans;
}
double calcy(double x)
{double ans=0;
  相关解决方案