认路

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;
}
posted @ 2016-11-04 12:08  Zeonfai  阅读(97)  评论(0编辑  收藏  举报