训练日记—2018.10.1

今天比赛第一道水题,忘了初始化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

*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值