Solution of ZOJ 2748 Free Kick

声明:转载或引用本文代码,请务必注明出处! http://blog.csdn.net/fduan

 

思路分析:此题为一道几何题,可以证明当人墙与右边两条直线所成三角形为等腰三角形时,人墙长度最短。接下来就是非常简单的几何计算了。下面给出我的实现代码,有一点需要注意,即使用三角函数时,有可能得出的人数为负数,这时应输出0。

 

#include <iostream> #include <string> #include <algorithm> #define _USE_MATH_DEFINES #include <math.h> #include <cstdio> using namespace std; int main() { double a, W, x, y, D, A; int num_def = 0; while( cin >> a >> W >> x >> y >> D >> A ) { double square_l1 = ( x + a ) * ( x + a ) + y * y; double square_l2 = ( x - a ) * ( x - a ) + y * y; double alpha = acos( ( - 4 * a * a + square_l1 + square_l2 ) / ( 2 * sqrt( square_l1 * square_l2 ) ) ); alpha -= A * M_PI / 180; alpha /= 2; num_def = ceil( 2 * D * tan( alpha ) / W ); num_def = max<int>( 0, num_def ); printf( "%d/n", num_def ); } return 0; }

你可能感兴趣的:(Solution of ZOJ 2748 Free Kick)