zoukankan      html  css  js  c++  java
  • HDU4973 【几何。】

    题意:

    给你一个以原点为圆心的两个圆,一个大圆,一个小圆,然后给你一个硬币和他的速度,问你经过大圆的时间;

    思路:

    直接杠。。

    然后wa的怀疑人生,后面wa在了速度的方向,如果我说一个点在两个圆的左上方,那么速度也是左上方,那么就是0;

    其他都还简单;

    贴一发比赛时的挫代码。。。

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <math.h>
    #include <queue>
    #include <stack>
    using namespace std;
    const int MAX=210;
    const double eps=1e-3;
    int n,m;
    int main()
    {
        int i,j,t;
        double Rm,r,R,x,y,vx,vy;
        while(~scanf("%lf%lf%lf%lf%lf%lf%lf",&Rm,&R,&r,&x,&y,&vx,&vy))
        {
            double x1,x2,y1,y2,x3,x4,y3,y4;
            double Rmr=(Rm+r)*(Rm+r);
            double Rr=(r+R)*(r+R);
            double a1=vx*vx+vy*vy;
            double b1=2*(vx*x+vy*y);
            double c1=x*x+y*y-Rr;
    
            double a2=vx*vx+vy*vy;
            double b2=2*(vx*x+vy*y);
            double c2=x*x+y*y-Rmr;
    
            double aa=vx*vx+vy*vy;	
    
            // 碰不到大圆
            if(b1*b1-4*a1*c1<=eps)
            {
                puts("0.000");
            }
            else
            {
                double time1,time2;
                double dt1=sqrt(b1*b1-4*a1*c1);
                time1=(-b1+dt1)/2.0/a1;
                time2=(-b1-dt1)/2.0/a1;
                if(time1<=eps)// 碰不到大圆  时间一定是正的
                {
                    puts("0.000");
                    continue;
                }
                x1=time1*vx+x;
                y1=time1*vy+y;
                x2=time2*vx+x;
                y2=time2*vy+y;
                //只经过大圆
                if(b2*b2-4*a2*c2<=eps)
                {
                    double ans=((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))/aa;
                    printf("%.6lf
    ",sqrt(ans));
                }
                else        //经过小圆和大圆
                {
                    double dt2=sqrt(b2*b2-4*a2*c2);
                    double time3,time4;
                    time3=(-b2+dt2)/2.0/a2;
                    time4=(-b2-dt2)/2.0/a2;
                    x3=time3*vx+x;
                    y3=time3*vy+y;
                    x4=time4*vx+x;
                    y4=time4*vy+y;
    
                    double ans1=((x1-x4)*(x1-x4)+(y1-y4)*(y1-y4))/aa;
                    double ans2=((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3))/aa;
    
                    double ans=min(ans1,ans2);
                    printf("%.6lf
    ",2*sqrt(ans));
                }
            }
        }
        return 0;
    }
    /*
    
    */
    



  • 相关阅读:
    解题:POI 2009 TAB
    解题:POI 2015 Pieczęć
    解题:POI 2013 Taxis
    解题:POI 2015 Kinoman
    题目1012:畅通工程(并查集)
    并查集深入分析
    题目1186:打印日期(日期计算)
    C/C++如何整行读入字符串?
    四种方法解决最大连续子序列和问题
    题目1011:最大连续子序列
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6216772.html
Copyright © 2011-2022 走看看