C 桌球——ICPC NEAU Programming Contest 2020
题目链接:https://nanti.jisuanke.com/t/45509
本质是水题...很气啊那个judge 以为是到线段的距离为2后来看题解才明白 只要白球和红球运动轨迹大于等于90度就不合法了
虽然到现在也迷迷糊糊不知道怎么判断的...可能是中学物理没学好_(:з」∠)_
整体思路就是 连接洞的圆心和红球的圆心,因为红球和白球的半径都是二所以通过延长直线可以找到白球应该到达的圆心 之后看白球运动轨迹的向量和红球接下来运动轨迹的向量的夹角是不是小于90度就ok
样例给的很清楚了 大概就是这个样子

没有用向量板子的原因是现在还不是很熟练....而且这题毕竟不用向量也写出来了w(我是菜鸡)
代码如下:
#include<bits/stdc++.h> #define ll long long #define maxn 300005 using namespace std; double pi=3.14159265358979; double eps2=1e-9; int judge(double wx,double wy,double find_x,double find_y,double rx,double ry) { double ans=(wx-find_x)*(rx-find_x)+(wy-find_y)*(ry-find_y); if (ans<0) { return 1; } else { return 0; } } int main() { int t; scanf("%d",&t); while(t--) { double wx=0,wy=0,rx=0,ry=0,hx=0,hy=0; scanf("%lf %lf %lf %lf %lf %lf",&wx,&wy,&rx,&ry,&hx,&hy); double find_x=0,find_y=0; if (abs(hx-rx)<eps2) { find_x=hx; if (hy-ry>eps2) { find_y=ry-2; } else { find_y=ry+2; } } else { double k=(hy-ry)/(hx-rx); double b=hy-k*hx; if (hx-rx>eps2) { find_x=rx-2*(1/sqrt(k*k+1)); } else { find_x=rx+2*(1/sqrt(k*k+1)); } find_y=find_x*k+b; } if (judge(wx,wy,find_x,find_y,rx,ry)==0) { cout<<"Impossible"<<endl; continue; } double sei=0; if (abs(find_x-wx)<eps2) { sei=0.5*pi; } else if (abs(find_y-wy)<eps2) { sei=0; } else { double k2=(find_y-wy)/(find_x-wx); if (wy-find_y>=eps2 && wx-find_x>=eps2) { sei=pi+atan(k2); } else if (wy-find_y>=eps2 && wx-find_x<eps2) { sei=2*pi+atan(k2); } else if (wy-find_y<eps2 && wx-find_x>=eps2) { sei=pi+atan(k2); } else { sei=atan(k2); } } //cout<<find_x<<' '<<find_y<<endl; printf("%.10f\n",sei/pi); } }

浙公网安备 33010602011771号