题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1245

Saving James Bond

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2608    Accepted Submission(s): 505

Problem Description
This
time let us consider the situation in the movie "Live and Let Die" in
which James Bond, the world's most famous spy, was captured by a group
of drug dealers. He was sent to a small piece of land at the center of a
lake filled with crocodiles. There he performed the most daring action
to escape -- he jumped onto the head of the nearest crocodile! Before
the animal realized what was happening, James jumped again onto the next
big head... Finally he reached the bank before the last crocodile could
bite him (actually the stunt man was caught by the big mouth and barely
escaped with his extra thick boot).
Assume that the lake is a
100×100 square one. Assume that the center of the lake is at (0,0) and
the northeast corner at (50,50). The central island is a disk centered
at (0,0) with the diameter of 15. A number of crocodiles are in the lake
at various positions. Given the coordinates of each crocodile and the
distance that James could jump, you must tell him whether he could
escape.If he could,tell him the shortest length he has to jump and the
min-steps he has to jump for shortest length.
 
Input
The
input consists of several test cases. Each case starts with a line
containing n <= 100, the number of crocodiles, and d > 0, the
distance that James could jump. Then one line follows for each
crocodile, containing the (x, y) location of the crocodile. Note that x
and y are both integers, and no two crocodiles are staying at the same
position.
 
Output
For
each test case, if James can escape, output in one line the shortest
length he has to jump and the min-steps he has to jump for shortest
length. If it is impossible for James to escape that way, simply ouput
"can't be saved".
 
Sample Input
4 10
17 0
27 0
37 0
45 0
1 10
20 30
 
Sample Output
42.50 5
can't be saved
 
Author
weigang Lee
 
题意: 湖是以(0,0)为中心的边长为100的正方形,开始小人在湖中心直径为15的岛上,中间的湖有很多的鳄鱼,求小人可以通过鳄鱼跳到岸上吗,小人每次跳跃距离不超过d
题解: 这个题建图是关键,建好图,用dijk或者是spfa求最短路都可以,将中心岛看成第一个点,将岸边看成是第n+2个点,然后枚举所有的两点之间,如果之间距离小于d就建一条两点之间的边,
再枚举每个点和中心岛屿和岸边的距离和岛屿和岸边建边,然后求最短路即可
复习一下dijk
代码:
 #include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define INF 0x1fffffff
#define N 110
struct Edge{
int to;
int next;
double v;
}edge[N*N]; struct point{
double x;
double y;
}p[N]; int head[N];
int m;
double fd(double x1, double y1, double x2 , double y2)
{
double tm = (x2-x1)*(x2-x1) +(y2-y1)*(y2-y1);
return sqrt(tm);
}
double dis[N];
int cnt[N];
int Enct;
bool vis[N];
void init()
{
Enct = ;
memset(head,-,sizeof(head));
memset(vis, , sizeof(vis));
for(int i = ;i < N ; i++){
dis[i] = INF;
cnt[i] = INF;
}
cnt[] = ;
dis[] = ;
}
void add(int from , int to , double v)
{
if(v>m) return ;
edge[Enct].to = to;
edge[Enct].v = v;
edge[Enct].next = head[from];
head[from] = Enct++;
edge[Enct].to = from;
edge[Enct].v = v;
edge[Enct].next = head[to];
head[to] = Enct++;
}
int n; void dijk()
{
for(int i = ;i < n ;i++)
{
//for(int j = 0; j < n; j++) printf("%.2lf ", dis[j]); puts("");
int Min = INF ;
int Minc = INF ;
int k = -;
for(int j = ; j < n ; j++)
{
if(!vis[j]&&dis[j]<=Min)
{
if(dis[j]<Min)
{
Min = dis[j];
k = j;
}
else if(dis[j]==Min&&cnt[j]<Minc)
{
Minc = cnt[j];
k = j;
}
}
}
//printf("%d \n",k);
if(Min == INF) return ;
vis[k] = ;
for( int j = head[k] ; j != - ; j = edge[j].next)
{
Edge e = edge[j];
if(!vis[e.to]&&(dis[k]+e.v)==dis[e.to]&&cnt[k]+<cnt[e.to])
{
cnt[e.to] = cnt[k]+;
}
if(!vis[e.to]&&dis[k]+e.v<dis[e.to])
{
cnt[e.to] = cnt[k]+;
dis[e.to] = dis[k]+e.v;
}
}
}
} int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
for(int i = ; i <= n ;i++)
{
double x, y;
scanf("%lf%lf",&x,&y);
p[i].x = x;
p[i].y = y;
double dd = -max(fabs(x), fabs(y));
if(dd <= m) add(i, n+, dd);
//if((x>=50-m&&x>y)||(x<=-(50-m)&&x<y)) add(i,n+1,(50-abs(x)));
//if((y>=50-m&&x<y)||(y<=-(50-m)&&x>y)) add(i,n+1,(50-abs(y)));
for(int j = ; j < i ; j++)
{
double flag = fd(p[i].x,p[i].y,p[j].x,p[j].y);
if(flag <= m) add(i,j,flag);
}
}
for(int i = ; i <= n; i++)
{
double tm = fd(p[i].x, p[i].y, , );
if(tm - 7.5 <= m) add(, i, tm - 7.5);
}
// for(int i = 0; i < n+2; i++)
// {
// printf("%d:", i);
//for(int j = head[i]; j != -1; j = edge[j].next) printf("(%d %.2lf) ", edge[j].to, edge[j].v);
// puts("");
// } n += ;
dijk();
if(dis[n-]==INF) puts("can't be saved");
else
printf("%.2f %d\n",dis[n-],cnt[n-]-);
}
return ;
}

Saving James Bond(dijk)的更多相关文章

  1. PTA 07-图5 Saving James Bond - Hard Version (30分)

    07-图5 Saving James Bond - Hard Version   (30分) This time let us consider the situation in the movie ...

  2. Saving James Bond - Easy Version (MOOC)

    06-图2 Saving James Bond - Easy Version (25 分) This time let us consider the situation in the movie & ...

  3. pat06-图4. Saving James Bond - Hard Version (30)

    06-图4. Saving James Bond - Hard Version (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作 ...

  4. pat05-图2. Saving James Bond - Easy Version (25)

    05-图2. Saving James Bond - Easy Version (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作 ...

  5. Saving James Bond - Hard Version

    07-图5 Saving James Bond - Hard Version(30 分) This time let us consider the situation in the movie &q ...

  6. Saving James Bond - Easy Version 原创 2017年11月23日 13:07:33

    06-图2 Saving James Bond - Easy Version(25 分) This time let us consider the situation in the movie &q ...

  7. PAT Saving James Bond - Easy Version

    Saving James Bond - Easy Version This time let us consider the situation in the movie "Live and ...

  8. 06-图2 Saving James Bond - Easy Version

    题目来源:http://pta.patest.cn/pta/test/18/exam/4/question/625 This time let us consider the situation in ...

  9. PTA 06-图2 Saving James Bond - Easy Version (25分)

    This time let us consider the situation in the movie "Live and Let Die" in which James Bon ...

随机推荐

  1. [array] leetcode - 39. Combination Sum - Medium

    leetcode - 39. Combination Sum - Medium descrition Given a set of candidate numbers (C) (without dup ...

  2. ASP.NET MVC下自定义错误页和展示错误页的几种方式

    在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是 ...

  3. bzoj 3626: [LNOI2014]LCA

    Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q ...

  4. 《跟我学IDEA》五、快捷键(编码利器)

    上一篇博文,我们学习了idea的一些模版配置,但是只有模版是不行的,一款编辑器如何能为我们灵活的使用,快捷键的功劳不用多说大家也明白.今天我们就来学习快捷键的配置以及一些常用的快捷键的介绍,为让家能更 ...

  5. (转) Linux中profile、bashrc、bash_profile之间的区别和联系

    原文地址:http://blog.csdn.net/chenchong08/article/details/7833242 /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登 ...

  6. spring的基本使用

    Spring的基本使用ioc,今天主要给大家说明了解决强耦合的联系,并且,注入的基本使用 Java里面的强耦合并且讲了spring是如何解决强耦合的第一种方式使用工厂模式,用的是反射,第二种方式是sp ...

  7. ubuntu更换阿里源

    网上应该可以找到很多关于ubuntu源的设置方法,但是如果不搞清楚就随便设置的话,不仅不能起到应有的效果,还会由于一些问题导致apt不可用. 最正确的更换源的方法应该如系统提示的: ## a.) ad ...

  8. python的range()函数

    range函数的三种用法:>>> range(1,5) # 代表从1到5(不包含5) [1, 2, 3, 4] >>> range(1,5,2) # 代表从1到5, ...

  9. JQuery基本语法(部分)

    1.jQuery介绍 jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML 元素选取 HTML 元素操作 CSS 操作 HTML 事件函数 JavaScrip ...

  10. [Redis源码阅读]dict字典的实现

    dict的用途 dict是一种用于保存键值对的抽象数据结构,在redis中使用非常广泛,比如数据库.哈希结构的底层. 当执行下面这个命令: > set msg "hello" ...