Keyword: math
Algorithm:
It is actually a math problem and with not much to do with programming.
Here's how to find the maximum value and the optimal theta.
Greatest value: always equal to the square root of a*a + b*b.
Theta: (represented by x)
let root = sqrt( a*a + b*b )
a * sin theta + b * cos theta
= root ( a/root * sin theta + b/root * cos theta )
= root sin( theta+x )
where cos x = a / root, and sin x = b / root
With these 2 conditions, you can find x easily, and x is just what you want.
Notice when a = b = 0, this formula leads to a wrong answer.
Code:
#include<cstdio> #include<cmath> int main() { int t; double a, b, pi = acos( -1 ), eps = 1e-14; scanf( "%d", &t ); while( t-- ) { scanf( "%lf %lf", &a, &b ); double len = sqrt( a*a + b*b ), theta = len? acos( a / len ) : pi / 2; if( b < 0 ) theta = 2 * pi - theta; printf( "%.2lf %.2lf\n", ( theta > pi / 2? 2.5 * pi - theta : pi / 2 - theta )+eps, len+eps ); } return 0; }
沒有留言:
張貼留言