今天比赛第一道水题,忘了初始化ans居然还WA了一发。然后就是我的锅,还没想清楚就直接敲K,敲完了发现一种情况遗漏了,就是应该直接枚举分块处的,水题不想敲了,正好老纪来了,就觉得他敲比我快一点。没想到出的比较慢。当时就是应该自己在敲一遍的,因为我敲了一遍了,思路什么的比较清晰了,而且那样,老纪就可以开其他题目了。这期间我们非常不明智的选择了开A题,这道题其实比较简单,但是我中间计算的时候很复杂,现在代码还没有调通,就是觉得计算几何以前没有敲过,很新鲜,而且我很喜欢计算几何,全凭高中向量和直线,圆的简单的关系裸推,我和阿秀一起推的。整体思路有了,这个时候老纪敲完了水题,已经2个小时多了吧。这期间我除了推A题,也想了一下lcm的题目,但是没有想法啊。然后电脑交给我,我就是先开始敲A题了。中间发现还有许多细节没有考虑到,边敲边改。以后这种还是提前画一个流程图比较好。然后发现其他队lcm的都过了,老纪和阿秀在这期间就在推这道题,说着说着他俩就出了,有思路后电脑交给老纪,很快就A了。然后他们就在推B题,构造题,我中间交了一发A ,WA了无果,自己造了几组样例,又改了向量的一些细节。
直到现在这道题我都不知道哪里敲错了,自己造的许多样例都过了。。。。也是有点郁闷。
然后比赛结束了,发现构造题也是神奇,跟他俩推的差不多,只能说时间有点少。
总结一下:水题这一类的还是我比较擅长,自己还是要加强自己的代码能力,越快A越好。遇到构造题目还是要两个人一起推。在中间如果有确定的思路就可以敲,觉得实在是比赛期间敲不出来的话一定要懂得舍弃,不能像这次一样固执。还是要多跟队友交流,我还没有跟他们商量过题呢。
贴一份WA的代码。。还是很想改对,明天总结整理一下这一块的模板。
#include<bits/stdc++.h>
using namespace std;
double k1,b1;///入射线
double k2,b2;///中垂线
double c1,c2,r,sx,sy,v1,v2,ex,ey;
double d1;
double jiao_x1,jiao_x2;
double jiao_y1,jiao_y2;
int main()
{
int t,cas=0;
scanf("%d",&t);
while(t--){
cas++;
scanf("%lf%lf%lf",&c1,&c2,&r);
scanf("%lf%lf%lf%lf",&sx,&sy,&v1,&v2);
scanf("%lf%lf",&ex,&ey);
if(v1==0){///就是斜率为wu,垂直于x轴
if(ex==sx){
if(v1>0)///说明向上抛
{
if(ey>=sy)
cout<<"Case #"<<cas<<": "<<"Yes"<<endl;
else
cout<<"Case #"<<cas<<": "<<"No"<<endl;
}
else{
if(ey<=sy)
cout<<"Case #"<<cas<<": "<<"Yes"<<endl;
else
cout<<"Case #"<<cas<<": "<<"No"<<endl;
}
}
else
cout<<"Case #"<<cas<<": "<<"No"<<endl;
}
else{
k1=v2*1.0/v1;///入射直线方程
b1=sy-(v2/v1)*sx;///
///先判直线与圆的位置关系
/// cout<<"???"<<endl;
if( abs(k1*ex+b1-ey)<0.00000001 ){
/// cout<<"&&&&&&&&&&&&&&&&&&"<<endl;
double lalax=v1,lalay=v2;
double lax=( ex-sx ),lay=(ey-sy);
int haha=(lalax*lax+lalay*lay)/(sqrt((lalax*lalax)+(lalay*lalay))*sqrt((lax*lax)+(lay*lay)));
if(haha==-1)
cout<<"Case #"<<cas<<": "<<"No"<<endl;
else
cout<<"Case #"<<cas<<": "<<"Yes"<<endl;
}
else{
double A,B,C,d;
double jiao_x1,jiao_x2;
double jiao_y1,jiao_y2;
double k,c,b;
A=k1;B=-1;C=b1;
///cout<<"k1:"<<k1<<" "<<"b1:"<<b1<<endl;
d=abs(A*c1+B*c2+C)/sqrt(A*A+B*B);
if(d>=r)///相离或相交,交点为1
{
/// cout<<"???"<<endl;
if(abs(k1*ex+b1-ey)<0.00000001){///在这条直线上
double kk=(ey-sy)/(ex-sx);
double kkk=(v2/v1);
if(kk==kkk){
cout<<"Case #"<<cas<<": "<<"Yes"<<endl;
}
else{
cout<<"Case #"<<cas<<": "<<"No"<<endl;
}
}
else
cout<<"Case #"<<cas<<": "<<"No"<<endl;
}
else {///交点有2个
k=k1;
c=-c1;
double d=-c2;
b=b1;
jiao_x1=-(sqrt(((k*k)+1)*(r*r)-c*c*k*k+(2*c*d+2*b*c)*k-d*d-2*b*d-b*b)+(d+b)*k+c)/(k*k+1);
jiao_x2=(sqrt(((k*k)+1)*(r*r)-c*c*k*k+(2*c*d+2*b*c)*k-d*d-2*b*d-b*b)+(-d-b)*k-c)/(k*k+1);
jiao_y1=-(k*(sqrt(k*k*r*r+r*r-c*c*k*k+2*c*d*k+2*b*c*k-d*d-2*b*d-b*b)+c)+d*k*k-b)/(k*k+1);
jiao_y2=-(k*(c-sqrt(k*k*r*r+r*r-c*c*k*k+2*c*d*k+2*b*c*k-d*d-2*b*d-b*b))+d*k*k-b)/(k*k+1);
///得到了两个交点
double dd1,dd2;
dd1=(jiao_x1-sx)*(jiao_x1-sx)+(jiao_y1-sy)*(jiao_y1-sy);
dd2=(jiao_x2-sx)*(jiao_x2-sx)+(jiao_y2-sy)*(jiao_y2-sy);
/// cout<<"dd1:"<<dd1<<" "<<"dd2:"<<dd2<<endl;
if(dd1>dd2){
swap(jiao_x1,jiao_x2);
swap(jiao_y1,jiao_y2);
}///交点是jiao_y1,jiao_y2;
/// cout<<"jiao_x1:"<<jiao_x1<<" "<<"jiao_y1:"<<jiao_y1<<endl;
///中垂线
k2=(jiao_y1-c2)/(jiao_x1-c1);
b2=(c2-k2*c1);///
/// cout<<k2<<" &&& "<<b2<<endl;
if(jiao_x1-c1!=0){///中垂线斜率有效的时候
double f1,f2;///
f1=ex-k2*((2*k2*ex+k2*k2*ey+2*b2-ey)/(k2*k2+1)-ey);
f2=(2*k2*ex+k2*k2*ey+2*b2-ey)/(k2*k2+1);
if(abs(k1*f1+b1-f2)<0.00000001){
cout<<"Case #"<<cas<<": "<<"Yes"<<endl;
}
else{
cout<<"Case #"<<cas<<": "<<"No"<<endl;
}
}
else{
/// cout<<"wuxiao"<<endl;
double midx=c1;
double duichen_x=midx-(ex-midx);
double duichen_y=ey;
/// cout<<"duichen_x"<<duichen_x<<" "<<duichen_y<<endl;
if(abs(k1*duichen_x+b1-duichen_y)<0.000000001){
cout<<"Case #"<<cas<<": "<<"Yes"<<endl;
}
else{
cout<<"Case #"<<cas<<": "<<"No"<<endl;
}
}
}
}
}
}
}
/*
1000
3 3 1
6 2 -1 0
5 2
3 3 1
5 2 -1 0
1 3
3 3 1
4 4 0 -1
4 2
3 3 1
5 4 -1 -1
5 2
3 3 1
5 4 -1 -1
5 1
3 3 1
5 4 1 1
5 26
3 3 1
6 2 -1 0
1 3
3 3 1
4 4 0 -1
4 2
3 3 1
5 4 -1 -1
5 2
3 3 1
5 4 -1 -1
5 1
3 3 1
5 4 1 1
5 2
*/