2014新生暑假个人排位赛02 E. 木头人足球赛

时间限制 1000 ms   内存限制 65536 KB

题目描述

木头人星的行动速度是地球上乌龟的 1/10 (所以可以忽略移动的速度),可是他们也热爱运动,尤其是足球。 他们的足球规则跟人类的一样,足球场尺寸为标准 105 * 68,两队各 11 名球员参赛。 假设 Mays 队的每个队员都是专业的球员,踢球都特别准。而她们的对手 Luke 队截球的规律是,如果行进的球离自己的距离不超过 d ,就可以截球成功。 现在 Mays 队的十号球员拿到了球,如果只允许一次射门,Mays 队能不能进球呢? 足球场在 xy 平面内,(0,0)至(105,68)矩形范围内,边缘与 x,y 轴平行且不能站人。其中Luke队的球门为(0, 30)-(0, 38),Mays 队的球门为(105,30)-(105, 38)

输入格式

第一行为组数 T  ,对这 T 组数据,每组第一行是Mays队十号球员的坐标 x0,y0 ,接下来 11 行为 Luke 队的 1 - 11 号队员的属性  xi,yi,di , 其中 xi,yi 表示 i 号球员的坐标, di 表示 i 号球员截球能力值。 保证所有坐标不重复且都在球场范围内, x,y 为整数, d 为正实数  1.0d3.0

输出格式

每组数据一行,如果 Mays 队10号队员直接可以射门得分,则输出“Shoot!‍‍”;如果10号队员不能成功射门,输出"Poor Mays!‍‍".

输入样例

1
104 34
1 24 2.928
48 25 2.605
15 41 1.312
39 42 2.454
3 12 2.080
18 39 1.564
10 36 2.530
97 13 1.589
101 57 1.844
84 39 2.561
0 33 1.831‍

输出样例

Shoot!‍
计算几何,判断射门,就是先求出人到球门上下的角度,然后求出所有防守球员的防守角度,取区间交。
 
 
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#define pi acos(-1.0)
#define eps 1e-8
using namespace std;
int tot,sig,num,t,c,ans[11],rec[11];
double d,high,low,up,down,alpha,beta,ang1,ang2;
 
struct pt1{double x,y;
    pt1(){}
    pt1(double x,double y):x(x),y(y){}
}a,ps,tst[11];
struct pt2{double x,y,d;}b[11];
 
struct field{double h,l;
    field(){}
    field(double h,double l):h(h),l(l){}
}seg[20];
int cmp(field a,field b){return a.l<b.l;}
 
double dist(pt1 p1,pt1 p2){return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}
void cal_po_cir_angl(pt1 tmp,pt1 ps,double r){
    if(tmp.y>=ps.y){
        d=dist(tmp,ps);
        alpha=asin(r/d),beta=asin((tmp.y-ps.y)/d);
        ang1=alpha/pi*180;ang2=beta/pi*180;
        up=ang1+ang2;
        down=up-2*ang1;
    }else{
        d=dist(tmp,ps);
        alpha=asin(r/d),beta=asin((ps.y-tmp.y)/d);
        ang1=alpha/pi*180;ang2=beta/pi*180;
        down=-ang1-ang2;
        up=down+2*ang1;
    }
}
void cal_h_l(pt1 ps){
    if(ps.y>38){
        low=-atan((ps.y-30)/ps.x)/pi*180;
        high=-atan((ps.y-38)/ps.x)/pi*180;
    }else if(ps.y<=38&&ps.y>=30){
        high=atan((38-ps.y)/ps.x)/pi*180;
        low=-atan((ps.y-30)/ps.x)/pi*180;
    }else if(ps.y<30){
        high=atan((38-ps.y)/ps.x)/pi*180;
        low=atan((30-ps.y)/ps.x)/pi*180;
    }
}
int main(){
    int i,j,k;
    for(scanf("%d",&t);t--;){
        sig=0;
            scanf("%lf%lf",&a.x,&a.y);
        for(i=0;i<11;i++)
            scanf("%lf%lf%lf",&b[i].x,&b[i].y,&b[i].d);
 
        ps=pt1(a.x,a.y);
 
        cal_h_l(ps);
        memset(seg,0,sizeof(seg));
        int cnt=0;
        for(i=0;i<11;i++){
            if(b[i].x>=ps.x)continue;
            pt1 tmp=pt1(b[i].x,b[i].y);
            cal_po_cir_angl(tmp,ps,b[i].d);
            if(up<low||down>high)continue;
            seg[cnt++]=field(up,down);
        }
        sort(seg,seg+cnt,cmp);
 
        if(low<seg[0].l)sig=1;
        if(sig==1){printf("Shoot!\n");continue;}
 
        double Maxh=seg[0].h;
        for(i=1;i<cnt;i++){
            if(seg[i].l>Maxh){sig=1;break;}
            else if(seg[i].h>Maxh)Maxh=seg[i].h;
        }
        if(high>Maxh)sig=1;
        if(sig==1){printf("Shoot!\n");continue;}
        printf("Poor Mays!\n");
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值