暑期个人赛--第三场--E(待A)

来源:互联网 发布:成龙终身成就奖 知乎 编辑:程序博客网 时间:2024/05/20 20:45

时间限制 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!‍‍".

输入样例

1104 341 24 2.92848 25 2.60515 41 1.31239 42 2.4543 12 2.08018 39 1.56410 36 2.53097 13 1.589101 57 1.84484 39 2.5610 33 1.831‍

输出样例

Shoot!‍

赛中提交:NULL


赛后AC:WA WA WA WA WA WA....还没A

(真是不知道哪里还有问题腊~!!可能姿势太丑.......

就是不过啊啊啊啊啊该考虑的问题都考虑了也拿了别人的代码来对了就是不行啊TT)


题目大意:

在一个直角坐标系中,给一个起点坐标,再给十一个障碍点坐标与其阻碍半径,还有有一个线段,要求是否可能

在线段上取一点引一条与起点坐标相连且不经过障碍点的障碍圆


思路:

从起点做射线,选定一个方向作为参考角度,设为零度。

然后求出起点到球门两边的连线的角度范围,以及与十一个阻碍球员防守半径圆的切线的角度范围

然后按照区间最大值或者最小值排序,看看有没有不覆盖的区间


还没AC先把代码贴出来吧:

#include "iostream"#include "string.h"#include "stdio.h"#include "stdlib.h"#include "math.h"#include "string"#include "vector"#include "list"#include "map"#include "queue"#include "stack"#include "bitset"#include "algorithm"#include "numeric"#include "functional" using namespace std;const double eps=1e-7;struct RANGE{    double high,low;}; int n;RANGE rad[15],mays; int cmp(RANGE a,RANGE b){    return a.high>b.high;}  int main(){    int T;    scanf("%d",&T);    while(T--){        bool flag=false,xflag=true;        double a,b,mid,d,r,range;        scanf("%lf %lf",&a,&b);        mays.high=atan((38-b)/a);        mays.low=atan((30-b)/a);        //printf("high%lf low%lf\n",mays.high*180,mays.low*180);         double x,y,dx,dy;        for(int i=0;i<11;i+=1){            scanf("%lf %lf %lf",&x,&y,&r);            dx=a-x;            dy=y-b;                    //这么写可以使得在水平线以上的圆的角度(mid)为正,水平线下的为负            d=sqrt(dx*dx+dy*dy);            range=asin(r/d);            if(d<=r){                //一旦出现了被包含在圆内的情况,一定不能进球,用xflag使后续判断失效                xflag=false;                break;            }            else if(a==x&&y>b){                mid=acos(-1)/2;            }            else if(a==x&&y<b){                mid=-acos(-1)/2;            }            else if(a<x&&y==b){      //在水平线上且在mays右边,除非包含在圆内(已判),否则不可能截球                rad[i].high=-99999999;                rad[i].low=-99999999;            }            else if(a<x&&y>b){       //所求角度为负,在以mays球员为原点的第三象限,加个兀                mid=atan(dy/dx)+acos(-1);                //printf("hhhhhhhh  a<x&&y>b  tan=%lf\n",atan(dy/dx));            }            else if(a<x&&y<b){       //所求角度为正,在以mays球员为原点的第二象限,减个兀                mid=atan(dy/dx)-acos(-1);                //printf("hhhhhhhh  a<x&&y<b  tan=%lf\n",atan(dy/dx));            }            else if(a>x){                mid=atan(dy/dx);                //printf("hhhhhhhh a>x tan=%lf\n",(atan(dy/dx)/acos(-1))*180);            }            rad[i].high=mid+range;            rad[i].low=mid-range;            //printf("mid%lf range%lf\n",(mid/acos(-1))*180,(range/acos(-1))*180);        }        /*printf("\n\n");        for(int i=0;i<11;i+=1){            printf("high%lf low%lf\n",(rad[i].high/acos(-1))*180+90,(rad[i].low/acos(-1))*180+90);        }        printf("\n\n");*/         sort(rad,rad+11,cmp);    //依照各段区间上限的降序排列         /*for(int i=0;i<11;i+=1){            printf("high%lf low%lf\n",(rad[i].high/acos(-1))*180+90,(rad[i].low/acos(-1))*180+90);        }*/         flag=false;        double minimum=9999999.0;        for(int i=0;xflag&&i<=10;i+=1){            if(rad[i].low>mays.high+eps){                continue;            }            else if(rad[i].high+eps<mays.low){                continue;            }            else if(rad[i].low>rad[i+1].high+eps&&rad[i+1].high+eps<minimum&&minimum>eps+mays.low&&rad[i].low>eps+mays.low){                //printf("eatshit%d %lf %lf\n",i+1,rad[i].low,rad[i+1].high);                flag=true;                break;            }            minimum=min(rad[i].low,minimum);             /*if(rad[i].high<mays.high){                flag=true;            }            else if(rad[i].low+eps<minimum+eps){                minimum=rad[i].high;            }*/        }         minimum=min(rad[10].low,minimum);        if(xflag&&(rad[0].high+eps<mays.high||minimum>eps+mays.low)){            flag=true;        }         /*if(!flag&&minimum+eps>mays.low){            flag=true;        }*/         if(xflag&&flag){            printf("Shoot!\n");        }        else{            printf("Poor Mays!\n");        }    }    return 0;}


0 0