uva 10387 Billiard

来源:互联网 发布:vscode路径插件 编辑:程序博客网 时间:2024/04/30 23:11

分析问题时,可以将速度分为水平方向和垂直方向的分量,简单推导之后,可以发现,最后球回到中点的时候,水平方向和垂直方向的路程分别为m*a和n*b,这样垂直方向和水平方向的速度分量比就是(n*b)/(m*a),这样所求角度的正切值就出来了,注意处理90度的特殊情况,然后用路程处以时间,速度的绝对值就出来了,将水平和垂直方向的速度值算平方和开根就是题目求的速度了。

#include <stdio.h>#include <math.h>#definePI(acos(-1.0))void func(int a, int b, int s, int m, int n){double angle;double v_x, v_y, v;v_x = m*a/(double)s;v_y = n*b/(double)s;v = sqrt(v_x*v_x + v_y*v_y);if(n*b == 0) //90度的特殊情况angle = 90.0;elseangle = atan(v_y/v_x)/PI*180;printf("%.2lf %.2lf\n", angle, v);}int main(void){int a, b, s, m, n;while(1){scanf("%d %d %d %d %d", &a, &b, &s, &m, &n);if(!a && !b && !s && !m && !n)break;func(a, b, s, m, n);}return 0;}