HDU 1245 Saving James Bond

链接:

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): 1066    Accepted Submission(s): 186

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

Recommend
Ignatius.L

分析与总结:

本题建图是关键:

1. 把整个这个岛看作为点0,由于中间的岛的直径为15,那么每只鳄鱼能否从岛上跳上需要特判,如果某只鳄鱼如果距离中心点(0,0)为dis,那么只要dis-7.5<=d, 就可以建立这条边的关系

2. 把整个岸边看为点n+1, 由于每只鳄鱼距离岸上的距离也不同,所以也需要特判。 取每只鳄鱼距离四个岸边最短的那个距离为权值。求距离岸边的方法: 我们知道湖的范围为(i,j),-50<i=j<50, 对于鳄鱼坐标(x,y),   50-max(abs(x), abs(y))便是这个坐标距离岸边最短的距离。

3. 本题很难发现的Trick:

  (1) 对于每只鳄鱼的坐标,有可能是不合法的,可能会是在中间的岛上,也能是在岸上,所以需要先过滤判断。

  (2) 如果James Bond可以跳的距离d大于42.50(岛到岸边的距离),那么可以直接跳到岸上,步数为1

建好图之后,用最短路算法计算即可。

另外,由于还要计算步数,再增加一个权值step,都赋值为1即可

代码:

用Dijkstra

#include<cstdio>
#include<cstring>
#include<math.h>
#include<iostream>
using namespace std;  

typedef double Type;
const int VN = 205;
const int INF=0x7fffffff/2;  

int n,size;
double D;
double x[VN];
double y[VN];
Type d[VN];
Type w[VN][VN];
int s[VN][VN];
int step[VN];
bool vis[VN];
int pos;
int end[VN];  

double getDist(int i, int j){
    return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));
}
void init(){
    pos = 0;
    size=0;
    x[0] = y[0] = 0;
}
double bankDist(double i, double j){ //增加岸边上的点
    return 50*1.0-max(fabs(i), fabs(j));
}  

void Dijkstra(int src){
    memset(vis, 0, sizeof(vis));
    for(int i=0; i<=n; ++i) d[i]=INF,step[i]=INF;
    step[src] = d[src] = 0;
    for(int i=0; i<=n; ++i){
        int u=-1;
        for(int j=0; j<=n; ++j)if(!vis[j]){
            if(u==-1 || d[j]<d[u]) u=j;
        }
        vis[u] = 1;
        for(int j=0; j<=n; ++j)if(!vis[j]){
            Type tmp = d[u]+w[u][j];
            int tmp_s = step[u]+s[u][j];
            if(d[j]>tmp){
                d[j]=tmp;
                step[j]=tmp_s;
            }
            else if(d[j]==tmp&&step[j]>tmp_s)
                step[j]=tmp_s;
        }
    }
}  

int main(){
    double a,b;
    while(~scanf("%d%lf",&n,&D)){
        if(D>=42.5){
            puts("42.50 1");
            continue;
        }
        init();
        for(int i=1; i<=n; ++i){
            scanf("%lf%lf",&a,&b);
            if(fabs(a)<=7.5&&fabs(b)<=7.5
              || fabs(a)>50 || fabs(b)>50)continue;
            x[++size]=a, y[size]=b;
        }
        n = size+1;
        for(int i=0; i<=n; ++i){
            w[i][i] = INF;
            s[i][i] = 0;
            for(int j=i+1; j<=n; ++j){
                w[i][j]=w[j][i]=INF;
                s[i][j]=s[j][i]=1;
            }
        }
        for(int i=1; i<=size; ++i){
            double dis = getDist(0,i);
            if(dis-7.5<=D){ // 从小岛可以跳上的点,整个小岛为点0
                w[0][i] = w[i][0] = dis-7.5;
            }
             // 从该点能否跳到岸上
            dis = bankDist(x[i],y[i]);
            if(dis<=D){
                w[i][n]=w[n][i]=dis;
            }
            for(int j=i+1; j<=size; ++j){
                dis = getDist(i,j);
                if(dis<=D){
                    w[i][j] = w[j][i] = dis;
                }
            }
        }
        Dijkstra(0);
        if(d[n]!=INF)printf("%.2f %d\n",d[n],step[n]);
        else puts("can't be saved");
    }
    return 0;
}

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索james
, escape
, and
, james550 5 7 1
, The
, could
that
hdu1245、saving bond、james bond、james bond theme、jamesbond007original,以便于您获取更多的相关知识。

时间: 2024-09-17 07:03:53

HDU 1245 Saving James Bond的相关文章

2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)

/* 这是我做过的一道新类型的搜索题!从来没想过用四维数组记录状态! 以前做过的都是用二维的!自己的四维还是太狭隘了..... 题意:悟空救师傅 ! 在救师父之前要先把所有的钥匙找到! 每种钥匙有 k 种, 每一种有多个! 只要求找到每一种的其中一个就可以! 找钥匙的顺序按照 第1种, 第2种, 第3种 ....第k种! 找钥匙的时间是一步, 走到相邻空地的时间是一步, 打蛇的时间就是两步! 求找到师傅的最少步数! 这里说一下 state[N][N][10][35]表示的含义: ->state[

最短路专题【完结】

第一题 hdu 1317 XYZZY 点击打开hdu 1317 思路: 1 题目的图是一个有向图,并且可能存在环.第一个点的能量值为100,边的权值利用能量大小,例如2点为-60,如果1->2那么value[1][2] = -602 题目明确指出如果是要win的话,那么必须是经过的每条边都要大于0.那么我们只要把那些经过松弛操作后的点大于0的入队即可,小于等于0的点肯定不会出现在最终的路径上.3 如果存在正环的话,那么就有能量值无限大,那么这个时候只要判断这个点能否到达n4 判断是否是有环还是五

CSS3实际案例资源:优秀的视差滚动网站

文章描述:随着css3属性的广泛支持,越来越被设计师所青昧 ,常常可以创造出惊人的网站作品出来,特别是视差滚动的出色表现. 随着css3属性的广泛支持,越来越被设计师所青昧 ,常常可以创造出惊人的网站作品出来,特别是视差滚动的出色表现.关于视差滚动在实现方面,在之前的文章中<利用JARALLAX实现超强视差滚动网页效果>也为大家介绍了一个小插件的实现方式,在这里就不多介绍了.在本文,将为大家分享14个非常优秀并且带有故事性趣味的视差滚动网站,认真的欣赏下去,或许你会喜欢上其中的某一个故事哦.你

演化架构和紧急设计: 使用 DSL

简介:至今, 演化构架和紧急设计 主要关注技术模式的紧急设计,本期将介绍使用特定领域语言 (DSL)捕获 领域惯用模式.系列作者 Neal Ford 用一个例子说明了该方法,显示了这种获取惯用模式 的抽象样式的优势. 惯用模式可以是 技术也可以是 领域.技术模式为常用的技术软件问题指出解决方案,例如在应用程 序(或应用程序套件)中怎样处理验证.安全和事务数据.前几期主要关注获取技术惯用模式所用的技术 ,例如元程序设计.域模式关注的是如何抽象常见业务问题.而技术模式几乎出现在所有的软件中,域模 式

20个豪华汽车、摩托车网页设计赏析

  汽车网站一般都要高端大气的设计,但怎么高端怎样大气呢?今天我们整理20个豪华汽车.摩托车网页设计作品,或许你能从中获取灵感哦!在下面这些汽车网页设计例子中,最主要特征就是把名车以大banner展示,并且尽量使用全屏式或全屏背景的网页设计,这样出来的网页比较"大气"呢!其次使用一些视差滚动的网页设计技术,提升整体网站视觉效果,更多细节请自行欣赏,同时还有很多豪车可让你大包眼福啊,Enjoy! Lamborghini Trail Jeeps Wiesmann Ride Barstow

Java正则表达式的应用

在很多种情况下,我们都必须对字符串进行匹配,以便判断字符串的格式是否符合要求,对字符串中的内容进行提取.比如,我要从一段话aabdfe中,判断这段话是否有包含ab这个词,那么如果用if-else来判断的话,那么我们必须遍历整个字符串,当遇到一个a,记录一下状态,判断下一个是否是所要的b.这个过程随着要判断的内容(在这里是ab)和要被字符串的长度的增长,恶心程度递增.但是又因为字符串的判断实在是太常要用到啦,所以就有了正则表达式这么个东西,正则表达式其实就是一个字符串识别的规则,通过这个规则,我们

SQL*Loader使用方法

--===================== -- SQL*Loader使用方法 --=====================   一.SQL*Loader的体系结构     SQL*Loader由一个输入控制文件来控制整个装载的相关描述信息,一个或多个数据文件作为原始数据,其详细组成结构包括         Input Datafiles      -->装载到数据库的原始数据文件         Loader Control file  -->提供给QL*Loader寻找及翻译数据的相

盘点那些年你看过的最烂最囧最不知所云的游戏封面

每到年终,我们总要进行各式各样的盘点和总结,而今天这个无疑是小编的最爱:把过去一年内那些最烂最囧最不知所云的游戏封面从阴暗的小角落里找出来,供大家取笑. 从某种程度上说,今年游戏封面的总体质量比去年要好,那些我们看一眼就想破口大骂的烂作品并不多.但是,就像烂片一样,制作粗劣的游戏封面是不可能从我们眼前消失的.下面,我们为您准备了10个今年最烂的游戏封面,请带着嘲弄尽情观赏吧. (另外,我们要说明的是,游戏封面并不能代表游戏品质的好坏.) 1.Sengoku Basara: Samurai Her

XMLTABLE by example, Part 1: Retrieving XML data in relational format

原文http://www.ibm.com/developerworks/data/library/techarticle/dm-0708nicola/   Harness the power of this useful SQL/XML function in DB2 Matthias Nicola (mnicola@us.ibm.com), DB2/XML Performance, IBM Silicon Valley Laboratory Vitor Rodrigues (vrodrig@u