暑期个人赛--第三场--E(待A)
来源:互联网 发布:成龙终身成就奖 知乎 编辑:程序博客网 时间:2024/05/20 20:45
425. 木头人足球赛
题目描述
木头人星的行动速度是地球上乌龟的
输入格式
第一行为组数
输出格式
每组数据一行,如果 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;}
- 暑期个人赛--第三场--E(待A)
- 暑期个人赛--第三场--E(待A....)
- 暑期个人赛--第四场--E(待A)
- 暑期个人赛--第五场--E(待A)
- 暑期个人赛--第四场--D(待A)
- 暑期个人赛--第六场--C(待A)
- 暑期个人赛--第三场--A
- (待切,标记上)暑期个人赛--第九场--E
- (待切,标记上)暑期个人赛--第八场--E
- (待切,标记上)暑期个人赛--第七场--E
- 暑期个人赛--第一场--E
- 暑期个人赛--第六场--E
- 暑期个人赛--第三场--B
- 暑期个人赛--第三场--C
- 暑期个人赛--第三场--D
- 暑期个人赛--第四场--A
- 暑期个人赛--第一场--A -
- 暑期个人赛--第五场--A
- 黑马程序员 第二章:多线程
- VIM的替换指令
- Blackfin DSP学习心得
- 黑马程序员 第三章:集合
- 黑马程序员 第四章:IO流
- 暑期个人赛--第三场--E(待A)
- 关于ExecuteNonQuery(),ExecuteReader();ExecuteScalar();之间的区别
- HDU 1151 Air Raid(最小路径覆盖)
- opencv学习笔记之Mat::at
- 在父进程中打开子进程
- GSM蜂窝基站定位基本原理浅析
- 很酷的光线滚动效果
- Androi学习:Camera初探——控制摄像头拍照
- assert() has been disabled for security reasons in php