天天寫演算法之Toxophily
阿新 • • 發佈:2019-02-14
#include<cstdio> #include<cmath> #define PI acos(-1.0) double x,y,v; inline double calculate(double angle)//已知角度計算所能達到高度的函式 { double time; time=x/( v*cos(angle) ); return -0.5*9.8*time*time+v*sin(angle)*time; } int main() { int t; double left,right,mid,midmid; scanf("%d",&t);//輸入測試資料的個數t while(t--) { scanf("%lf%lf%lf",&x,&y,&v);//輸入果實橫座標x,縱座標y以及箭離弦時的速度 /*三分查詢尋找箭達到果實高度y時的最大角度*/ left=0;right=PI/2;//設定上、下界初值,在0~90°尋找 while(right-left>1e-10) { mid=(right+left)/2;//計算中值 midmid=(mid+right)/2;//計算中值 if(calculate(mid)<calculate(midmid)) left=mid; else right=midmid; } if(calculate(mid)<y)//當所能達到的最大高度無法到達所給高度時,說明箭無法射中果實 printf("-1\n");//輸出-1 else//否則 { /*二分查詢滿足題設的最小角度*/ left=0;right=mid;//設定上、下界初值,在0~mid尋找 while(right-left>1e-10) { mid=(left+right)/2;//設定中值 if(calculate(mid)<y) left=mid; else right=mid; } printf("%.6lf\n",left); } } return 0; }
有更好的理解方法的可以幫忙再解釋一下