• 认路


    Description
    OTL来到ORZ公司面试。但是ORZ公司很大,有很多大厅。而且OTL有开阔空间恐惧症,因为会迷路!尽管OTL来公司之前已经研究了地图很多遍,却还是在入口处就不知道怎么走了……于是,他只好求助你。

    OTL给你的地图是一个三维电子地图(不要在意这是怎么画的)。地图标出了N个大厅,0号大厅是入口,N-1号大厅是OTL的面试地点。每个大厅的三维坐标都被给出,且有直线通道连接任意两个大厅。每个大厅的面积Si也被给出。由于当初设计师比较懒,所以这个面积一定是整数。由于OTL的开阔空间恐惧症,他希望经过的所有大厅面积之和尽可能小。而且,由于已经在大楼里转了一圈又一圈的OTL已经筋疲力尽,所以当两个大厅之间的距离超过dis时,OTL就不会走这条通道。而且,当这个面积之和超过220时,就会考虑去其他公司面试。现在,他希望知道他经过的大厅面积之和最少为多少。

    Input
    第一行一个整数N、一个两位小数dis,大厅数量和OTL可能通过的通道的最大距离。

    接下来N行,每行三个小数xi、yi、zi、一个整数Si,每个大厅的三维坐标和面积。

    Output
    一个整数,表示OTL经过的大厅面积之和最少为多少。如果不可能到达,输出-1。
    【输入输出样例1】

    path.in

    7 5.00

    7.87 0.35 4.12 62

    4.82 -0.17 6.58 37

    9.46 4.32 8.90 42

    10.36 6.92 10.43 53

    6.73 -2.07 7.87 44

    7.95 2.61 4.22 96

    -0.13 -3.69 10.02 77

    path.out

    -1

    【输入输出样例2】

    path.in

    7 5.00

    9.73 1.03 8.62 61

    9.82 -3.96 9.48 10

    6.24 -0.48 9.33 23

    7.48 -4.75 5.44 96

    5.51 -3.49 6.36 34

    8.08 0.35 5.89 37

    6.07 -7.13 9.02 34

    path.out

    128

    HINT
    对于100%的数据有0≤N≤10000,0≤dis≤1000,0≤Si≤100。


    暴力. 数据范围貌似有问题啊…

    #include<iostream>
    #include<string.h>
    #include<queue>
    #include<math.h>
    using namespace std;
    const int maxN = (int)1e4;
    struct hall
    {
        double x, y, z;
        int s;
    }a[maxN];
    int minS[maxN];
    struct pos
    {
        int x, sum;
        pos(int _x, int _sum): x(_x), sum(_sum){}
    };
    int operator <(pos x, pos y)
    {
        return x.sum > y.sum;
    }
    priority_queue<pos>Q;
    inline double sqr(double x)
    {
        return x * x;
    }
    inline double getDis(hall x, hall y)
    {
        return  sqrt(sqr(x.x - y.x) + sqr(x.y - y.y) + sqr(x.z - y.z)); 
    }
    int main()
    {
        ios::sync_with_stdio(false);
        int n;
        double dis;
        cin >> n >> dis;
        for(int i = 0; i < n; i ++)
            cin >> a[i].x >> a[i].y >> a[i].z >> a[i].s;
        memset(minS, 127, sizeof(minS));
        minS[0] = a[0].s;
        Q.push(pos(0, a[0].s));
        while(! Q.empty())
        {
            pos cur = Q.top();
            if(cur.x == n - 1)
            {
                cout << cur.sum;
                return 0;
            }
            for(int i = 0; i < n; i ++)
                if(getDis(a[cur.x], a[i]) <= dis && cur.sum + a[i].s < minS[i])
                    minS[i] = cur.sum + a[i].s, Q.push(pos(i, cur.sum + a[i].s));
            Q.pop(); 
        }
        cout << -1;
    }
  • 相关阅读:
    LeetCode具体分析 :: Recover Binary Search Tree [Tree]
    [leetcode] Path Sum
    System、应用程序进程的Binder线程池和Handler消息循环
    R(二): http与R脚本通讯环境安装
    R(一): R基础知识
    Hive(五):hive与hbase整合
    Hive(六):HQL DDL
    Hive(四):c#通过odbc访问hive
    Hive(三):SQuirrel连接hive配置
    Hive(二):windows hive ODBC 安装
  • 原文地址:https://www.cnblogs.com/ZeonfaiHo/p/6402869.html
Copyright © 2020-2023  润新知