• (花里胡哨)New Game!(牛客国庆集训派对Day1)


    链接:https://ac.nowcoder.com/acm/contest/201/L
    来源:牛客网
     

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 1048576K,其他语言2097152K
    Special Judge, 64bit IO Format: %lld

    题解:看样子很复杂,其实很简单,是个最短路径板子题,主要是存图,这里有三种距离

    一个是圆与圆之间的距离(需减去两个圆的半径,圆上走也不消耗体力,结果为负,距离为零)

    一个是圆与直线之间的距离(需减去一个圆的半径,结果为负,距离为0)

    一个是直线与直线之间的距离(直接求就完事了)

    另一个需要注意的是按序号代表每一个元素就行了,比如序号0代表第一根直线,1到n代表n个圆,n+1代表最后一根直线

    用邻接矩阵存距离就行辣~(数据感人,大数不能用) 

      0 1 2 ``` n n+1
    0            
    1            
    2            
    ```            
    n            
    n+1            

    题目描述

    Eagle Jump公司正在开发一款新的游戏。Hifumi Takimoto作为其中的员工,获得了提前试玩的机会。现在她正在试图通过一个迷宫。
    这个迷宫有一些特点。为了方便描述,我们对这个迷宫建立平面直角坐标系。迷宫中有两条平行直线 L1:Ax+By+C1=0, L2:Ax+By+C2=0,还有 n 个圆 。角色在直线上、圆上、园内行走不消耗体力。在其他位置上由S点走到T点消耗的体力为S和T的欧几里得距离。
    Hifumi Takimoto想从 L1 出发,走到 L2 。请计算最少需要多少体力。

    输入描述:

    第一行五个正整数 n,A,B,C1,C2 (1≤ n ≤ 1000, -10000 ≤ A,B,C1,C2 ≤ 10000),其中 A,B 不同时为 0。
    接下来 n 行每行三个整数 x,y,r(-10000 ≤ x,y ≤ 10000, 1≤ r ≤ 10000) 表示一个圆心为 (x,y),半径为 r 的圆。

    输出描述:

    仅一行一个实数表示答案。与正确结果的绝对误差或者相对误差不超过 10-4 即算正确。

    示例1

    输入

    复制

    2 0 1 0 -4
    0 1 1
    1 3 1

    输出

    复制

    0.236068
    

    最后附上代码

    #include <iostream>
    #include <cmath>
    #include <cstring>
    using namespace std;
    double n,a,b,c1,c2;
    const int maxn=1e3+2;
    #define INF 0x3f3f3f3f
    double map[maxn][maxn];
    double d[maxn];
    bool used[maxn];
    int V;
     
    struct node{
        double x;
        double y;
        double r;
    }cir[maxn];
    double disc(node a,node b){
        return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))-a.r-b.r;
    }
    double discx(double a,double b,double c,node ci){
        return fabs(ci.x*a+ci.y*b+c)/sqrt(a*a+b*b)-ci.r;
    }
    void dijkstra(int s){
        V=n+2;
        fill(d,d+V,INF);
        fill(used,used+V,false);
        d[s]=0;
        while(true){
            int v=-1;
            for(int u=0;u<V;u++){
                if(!used[u] &&(v==-1||d[u]<d[v]))
                    v=u;
            }
            if(v==-1)
                break;
            used[v]=true;
            for(int u=0;u<V;u++){
                d[u]=min(d[u],d[v]+map[v][u]);
            }
        }
    }
    int main(){
        cin>>n>>a>>b>>c1>>c2;
        for(int i=1;i<n+1;i++){
            cin>>cir[i].x>>cir[i].y>>cir[i].r;
        }
        memset(map,INF,sizeof(map));
        for(int i=1;i<n;i++){
            for(int j=i+1;j<n+1;j++){
                double temp=disc(cir[i],cir[j]);
                if(temp>0){
                    map[i][j]=map[j][i]=temp;
                }
                else
                    map[i][j]=map[j][i]=0;
            }
        }
        int p=n+1;
        for(int i=1;i<n+1;i++){
            double temp=discx(a,b,c1,cir[i]);
            if(temp>0){
                map[0][i]=map[i][0]=temp;
            }
            else
                map[0][i]=map[i][0]=0;
            double tmp=discx(a,b,c2,cir[i]);
            if(tmp>0){
                map[p][i]=map[i][p]=tmp;
            }
            else
                map[p][i]=map[i][p]=0;
        }
        map[0][p]=map[p][0]=(fabs(c1-c2)/sqrt(a*a+b*b));
     
        dijkstra(0);
     
        cout<<d[p]<<endl;
        return 0;
    }
  • 相关阅读:
    Centos6.10-FastDFS-存储器Http配置
    Centos6.10-FastDFS-Storage.conf配置示例
    Centos6.10-FastDFS-Tracker.conf示例配置
    sublime不支持ascill编码办法
    VMware虚拟磁盘修复
    Centos610安装Nexus
    JavaWeb项目用浏览器打开网页出现Session Error提示的解决办法
    Ext里dialog弹窗关闭与父窗口刷新问题总结
    js里常见的三种请求方式$.ajax、$.post、$.get分析
    formValidation单个输入框值改变时校验
  • 原文地址:https://www.cnblogs.com/UUUUh/p/10284065.html
Copyright © 2020-2023  润新知