ZOJ2748 Free Kick

Free Kick

Time Limit: 2 Seconds       Memory Limit: 65536 KB

In a soccer game, a direct free kick is also awarded to the opposing team if a player commits any of the offences.

A direct free kick in an immediate distance is a nightmare of the goalie. In order to help their goalkeeper, the defenders often choose to stand side by side between the free kick position and the goal, just like a straight "WALL". The goalkeeper expects the "WALL" can receive the shooting angle as much as possible. However, there are only 11 players in a team and some of them must pay attention to other offenders, so the defenders to make up the "WALL" are quite limited.

Let's make the problem easier on a simplified field map, shown as above. The two ends of the goal locate at (-a,0) and (a,0) respectively, and the free kick position is (x, y). Assuming the body width of every defender is always W, your task is to determine how many defenders are required at the least to make up the "WALL", so that they can help their goalie receive the shooting angle. According to FIFA's law, all the defender must keep a distance not less than D from the free kick position. The goalie will feel safe if the remaining shooting angle after the "WALL" is strictly less than A degree.


Input

The input consists of several test cases. In each case, there are six numbers in a single line, indicating aWxyD and A respectively.

Constraints:

  • aWDA are all positive numbers;
  • The distance between the goal and the free kick position is guaranteed greater than D;
  • The absolute value of each non-zero number is in the range [10-6, 106].

Proceed until the end of file.


Output

For each case, print an integral number on a single line, which denotes the minimal number of defenders is required to make the goalie safe. Note that this number may be greater than 11.


Sample Input

3.66 0.5 5 20.2 9.15 10
3.66 0.5 -5 -20.3 9.15 10

Sample Output

4
3

——————————————————————————————————————
题目的意思是给出射手位置和球门位置,防守人员宽度和距离射手最小距离及最大角度,求最少安排几个人
我们可以清楚知道,把人安排在角平分上收益最大,所以先余弦定理算出射手与门框两侧夹角,在通过边角关系算出答案。

注意:所给最大角度可能已经比射手与门框两侧夹角大了,这样导致算出的人可能是负的,取0

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include <functional>
#include <bitset>
#include <string>

using namespace std;

#define LL long long
#define INF 0x3f3f3f3f
const double pi=acos(-1.0);

struct point
{
    double x,y;
};

double dis(point v1,point v2)
{
    return sqrt((v1.x-v2.x)*(v1.x-v2.x)+(v1.y-v2.y)*(v1.y-v2.y));
}

int main()
{
    double a,W,D,A;
    point v1,v2,u;
    while(~scanf("%lf%lf%lf%lf%lf%lf",&a,&W,&u.x,&u.y,&D,&A))
    {
        A=A/180*pi;
        v1.x=-a,v1.y=0;
        v2.x=a,v2.y=0;
        double X=dis(u,v1);
        double Y=dis(u,v2);
        double Z=dis(v1,v2);
        double B= acos((X*X+Y*Y-Z*Z)/(2*X*Y));
        double C=(B-A)/2;
        double w=D*tan(C);
        w*=2;
        int ans=ceil(w/W);
        printf("%d\n",max(ans,0));
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值