UVA 1001 Say Cheese

题意:

  一只母老鼠想要找到她的玩具,而玩具就丢在一个广阔的3维空间上某个点,而母老鼠在另一个点,她可以直接走到达玩具的位置,但是耗时是所走过的欧几里得距离*10s。还有一种方法,就是靠钻洞,洞是球形的,在洞内怎么走都是不耗时间的。求母老鼠找到她的玩具所耗时?

分析:

  洞到洞的最短距离都是圆心距离减去半径。剩下的就是求单源最短路径。

代码:

  

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <map>using namespace std;typedef long long ll;const int maxn=102;int x[maxn],y[maxn],z[maxn],r[maxn];double g[maxn][maxn];int vis[maxn];double d[maxn];double INF = 1e9;ll ping(ll x){    return x*x;}double dist(int i,int j){    return sqrt(ping(x[i]-x[j])+ping(y[i]-y[j])+ping(z[i]-z[j]))-r[i]-r[j];}double dijkstra(int n){    for(int i=1;i<n;i++)        d[i]=INF;    memset(vis,0,sizeof(vis));    for(int i=0;i<n;i++)    {        int x;        double m = INF;        for(int y=0;y<n;y++)            if(!vis[y]&&d[y]<m)                m=d[x=y];        if(x==n-1)            return d[n-1];        vis[x]=1;        for(int y=0;y<n;y++)            d[y]=min(d[y],d[x]+g[x][y]);    }    return INF;}int main(){    int n,cas=0;    while(scanf("%d",&n)&&n>=0)    {        memset(r,0,sizeof(r));        int i,j;        for(i=1;i<=n;i++)            scanf("%d%d%d%d",&x[i],&y[i],&z[i],&r[i]);        scanf("%d%d%d",&x[0],&y[0],&z[0]);        scanf("%d%d%d",&x[n+1],&y[n+1],&z[n+1]);        //<<1<<endl;        for(i=0;i<=n+1;i++)        {            for(j=i+1;j<=n+1;j++)            {                g[i][j]=max(0.0,dist(i,j));                g[j][i]=g[i][j];            }        }        printf("Cheese %d: Travel time = %.0lf sec\n",++cas,dijkstra(n+2)*10);    }}
时间: 2024-08-13 14:46:35

UVA 1001 Say Cheese的相关文章

UVa 1001 Say Cheese (Dijkstra)

题意:给定一个三维空间的一些球和起始位置和结束位置,问你最短要花的时间是多少. 析:建图,所有的位置都建立图,边权就是距离,最小求一次最短路即可. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <

UVA - 1001 Say Cheese(奶酪里的老鼠)(flod)

题意:无限大的奶酪里有n(0<=n<=100)个球形的洞.你的任务是帮助小老鼠A用最短的时间到达小老鼠O所在位置.奶酪里的移动速度为10秒一个单位,但是在洞里可以瞬间移动.洞和洞可以相交.输入n个球的位置和半径,以及A和O的坐标,求最短时间. 分析: 1.因为洞可以相交,所以在计算两点距离时要判断一下if(dist > num[i].r + num[j].r). 2.两球间的距离为球心间距离-两球半径,起点和终点不是球,可将半径设为0. #pragma comment(linker, &

UVA 1001 Say Cheese (最短路,floyd)

题意:一只母老鼠想要找到她的公老鼠玩具(cqww?),而玩具就丢在一个广阔的3维空间(其实可以想象成平面)上某个点,而母老鼠在另一个点,她可以直接走到达玩具的位置,但是耗时是所走过的欧几里得距离*10s.还有一种方法,就是靠钻洞,洞是球的,而在洞内怎么走都是不耗时间的.求母老鼠找到她的玩具所耗时? 思路:先要看清楚题意先!尽可能要找到洞,如果洞的半径越大,那么就可以越省时.如果老鼠和玩具都在同个洞上,那么不耗时即可找到. 其实就是求单源最短路,只是计算两点间的长度时要考虑到半径的.而且得注意两洞

UVa 1001 奶酪里的老鼠(Dijkstra或Floyd)

https://vjudge.net/problem/UVA-1001 题意:一个奶酪里有n个洞,老鼠在奶酪里的移动速度为10秒一个单位,但是在洞里可以瞬间移动.计算出老鼠从A点到达O点所需的最短时间. 思路:最短路问题. 我们可以把起点和终点也看成是两个洞,半径为0.这样每个洞就代表了一个点,对于两个洞而言,圆心距离大于两半径之和,此时它们之间的距离就为圆心距离-两半径之和,否则就为0. 我们在计算出任意两个洞之间的距离之后,就可以套用最短路代码来解题了.下面的代码我是用了Floyd算法. 1

uva 1001(最短路)

题意:在一个三维的奶酪里面有n(n<=100)个洞,老鼠A想到达老鼠B的位置,在洞里面可以瞬间移动,在洞外面的移动速度为10秒一个单位,求最短时间 题解:如果两个洞相交,那么d[i][j]=0:如果不相交,那么d[i][j]=dist-(r[i]+r[j]),dist为这两个洞圆心之间的欧几里得距离 再用Dijkstra处理就可以了 #include <cstdio> #include <iostream> #include <sstream> #include

uva 1001 建图+最短路

题意: 在一个三维的空间内求从起点到终点的最短时间花费. 其中n个洞,在洞内通过的时间花费是0,在洞外的时间花费是每单位10sec 思路: 水题 建立起点到每个洞的边,建立终点到每个洞的边,建立起点到终点的边 ,边权是到达所需的时间花费.求一次最短路即可. code: #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #i

1001 - Say Cheese (Dijkstra算法)

该题是求两点间的最短路问题,用Dijkstra算法比较快 ,跑了0.003s . 方法很简单,将圆看成结点,直接判断两个圆是否相交,如果相交距离为0,否则距离为圆心间距离减去两圆半径. 起点和终点也可以看成是一个半径为0的圆 . 这样就变成了两点间的最短路问题,适合用Dijkstra算法求解.  比较坑的是该题说了数据范围n最大100,但是我开了105竟然RE ,看成505就过了 .  所以在占用内存不多的情况下还是开大一点好 . 细节参见代码: #include<bits/stdc++.h>

UVA - 11437 - Triangle Fun (计算几何~)

UVA - 11437 Triangle Fun Time Limit: 1000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem A Triangle Fun Input: Standard Input Output: Standard Output In the picture below you can see a triangle ABC. Point D, E

UVa 10679 - I Love Strings!!

题目:给你一个目标串,和一些模式串,问每个模式串是否在目标串中出现. 分析:字符串,AC自动机.一开始用KMP算法,TLE了才发现会超时,改用AC自动机: 直接利用AC自动机存储,查询即可,然后按顺序输出: 如果模式串中有重复的,直接利用并查集合并即可,只须判断父节点. 说明:╮(╯▽╰)╭计算复杂度时,数据组数被忽略了:注意初始化. #include <iostream> #include <cstdlib> #include <cstring> #include &