认路
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;
}