Bessie and the rest of Farmer John's cows are taking a trip this winter to go skiing. One day Bessie finds herself at the top left corner of an R (1 <= R <= 100) by C (1 <= C <= 100) grid of elevations E (-25 <= E <= 25). In order to join FJ and the other cows at a discow party, she must get down to the bottom right corner as quickly as she can by travelling only north, south, east, and west.

Bessie starts out travelling at a initial speed V (1 <= V <= 1,000,000). She has discovered a remarkable relationship between her speed and her elevation change. When Bessie moves from a location of height A to an adjacent location of eight B, her speed is multiplied by the number 2^(A-B). The time it takes Bessie to travel from a location to an adjacent location is the reciprocal of her speed when she is at the first location.

Find the both smallest amount of time it will take Bessie to join her cow friends.

Input

* Line 1: Three space-separated integers: V, R, and C, which respectively represent Bessie's initial velocity and the number of rows and columns in the grid.

* Lines 2..R+1: C integers representing the elevation E of the corresponding location on the grid.

Output

A single number value, printed to two exactly decimal places: the minimum amount of time that Bessie can take to reach the bottom right corner of the grid.

Sample Input

1 3 3
1 5 3
6 3 5
2 4 3

Sample Output

29.00

Hint

Bessie's best route is: 
Start at 1,1 time 0 speed 1 
East to 1,2 time 1 speed 1/16 
South to 2,2 time 17 speed 1/4 
South to 3,2 time 21 speed 1/8 
East to 3,3 time 29 speed 1/4
 
这个题用vector的话会T
下面是vector是T的代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>
#define Inf 0x3f3f3f3f const int maxn=1e5+;
typedef long long ll;
using namespace std;
ll ksm(ll x,ll y)
{
ll ans=;
while(y)
{
if(y&)
{
ans=ans*x;
}
x*=x;
y>>=;
}
return ans;
}
struct node
{
int to;
double w;
bool friend operator < (node x,node y)
{
return x.w>y.w;
}
};
int Map[]; vector<node>vec[];
double dis[];
int vis[];
int V,R,C;
int dir[][]={{,},{,-},{-,},{,}};
bool check(int x,int y)
{
if(x>=&&x<=R&&y>=&&y<=C)
{
return true;
}
else
{
return false;
}
}
void init()
{
for(int t=;t<=R*C;t++)
{
dis[t]=;
}
} void Dijkstra(int s)
{
node st;
st.to=s;
st.w=;
priority_queue<node>q;
q.push(st);
dis[s]=;
while(!q.empty())
{
node now=q.top();
q.pop();
if(vis[now.to])continue;
vis[now.to]=; int len=vec[now.to].size();
for(int t=;t<len;t++)
{
node tto=vec[now.to][t]; if(vis[tto.to]==&&tto.w+dis[now.to]<dis[tto.to])
{
tto.w=tto.w+dis[now.to];
dis[tto.to]=tto.w;
q.push(tto);
}
}
}
} int main()
{
// std::ios::sync_with_stdio(false);
scanf("%d%d%d",&V,&R,&C);
init();
for(int t=;t<=R;t++)
{
for(int j=;j<=C;j++)
{
scanf("%d",&Map[(t-)*C+j]);
}
}
for(int t=;t<=R;t++)
{
for(int j=;j<=C;j++)
{
for(int k=;k<;k++)
{
int xx=t+dir[k][];
int yy=j+dir[k][];
if(check(xx,yy))
{
node s;
s.to=(xx-)*C+yy;
s.w=1.0/V*ksm(,Map[(t-)*C+j]-Map[]);
vec[(t-)*C+j].push_back(s);
}
}
}
}
Dijkstra();
printf("%.2f\n",dis[R*C]); return ;
} AC的是邻接表的
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath> const int maxn=1e4+;
typedef long long ll;
using namespace std; struct edge
{
int u,v;
double w;
int next;
}edge[maxn*]; struct node
{
int pos;
double w;
node(int x,double y)
{
pos=x;
w=y;
}
bool friend operator <(node x,node y)
{
return x.w>y.w;
}
};
int n,m,s,x,y,z,tot = ,V;
bool check(int x,int y)
{
if(x>=&&x<=n&&y>=&&y<=m)
{
return true;
}
else
{
return false;
}
}
int head[];
double d[];
int vis[];
int a[];
int dist[][] = {{-,},{,-},{,},{,}}; void add(int u,int v,double w)
{
edge[++tot].u=u;
edge[tot].v=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot;
return ;
} void Dijkstra(int s)
{
priority_queue<node>q;
d[s]=;
q.push(node(s,));
while(!q.empty())
{
node now=q.top();
q.pop();
//cout<<now.pos<<endl;
if(vis[now.pos])continue;
vis[now.pos]=; for(int i=head[now.pos];i!=-;i=edge[i].next)
{
int ne=edge[i].v;
double ww=edge[i].w;
if(d[now.pos]+ww<d[ne])
{
d[ne]=d[now.pos]+ww;
q.push(node(ne,d[ne]));
}
}
}
return ;
}
int main()
{
scanf("%d%d%d",&V,&n,&m);
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis)); for(int t=;t<=n*m;t++)
{
d[t]=;
}
for(int i = ;i <= n; ++i)
for(int j = ;j <= m; ++j)
scanf("%d",&a[(i-)*m+j]);
for(int i = ;i <= n; ++i)
for(int j = ;j <= m; ++j)
for(int k = ;k < ; ++k)
{
int x = i + dist[k][];
int y = j + dist[k][];
if(check(x,y))
{
double v = 1.0 / V * pow(2.0 , a[(i-)*m+j] - a[]);
add((i-)*m+j,(x-)*m+y,v);
}
}
Dijkstra();
printf("%.2f\n",d[n * m]);
return ;
}

POJ - 3037-Skiing(邻接表+Dijkstra)的更多相关文章

  1. POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化

    昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...

  2. poj 1511(SPFA+邻接表)

    题目链接:http://poj.org/problem?id=1511 思路:题目意思很简单就是要求源点到各点的最短路之和,然后再求各点到源点的最短路之和,其实就是建两个图就ok了,其中一个建反图.1 ...

  3. USACO 2008 January Silver Telephone Lines /// 二分最短路 邻接表dijkstra oj22924

    题目大意: 一共有N (1 ≤ N ≤ 1,000)个电线杆,有P P (1 ≤ P ≤ 10,000)对电线杆是可以连接的, 用几条线连接在一起的电线杆之间都可相互通信,现在想要使得电线杆1和电线杆 ...

  4. POJ - 3255 SPFA+邻接表求次短路径

    题意:给出m条边 , n个顶点,u [ i ]到v [ i ] 的距离w [ i ],求除了最短路的那条最短的边的长度. 思路:之前有做过相似的题,使用迪杰斯特拉算法求单源最短路径,并且记录路径,枚举 ...

  5. POJ 3037 Skiing(Dijkstra)

    Skiing Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4668   Accepted: 1242   Special ...

  6. POJ 3037 Skiing(如何使用SPFA求解二维最短路问题)

    题目链接: https://cn.vjudge.net/problem/POJ-3037 Bessie and the rest of Farmer John's cows are taking a ...

  7. POJ - 3037 Skiing SPFA

    Skiing Bessie and the rest of Farmer John's cows are taking a trip this winter to go skiing. One day ...

  8. Poj(2679),SPFA,邻接表(主流写法)

    题目链接:http://poj.org/problem?id=3268 题意: 有编号为1-N的牛,它们之间存在一些单向的路径.给定一头牛的编号,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求 ...

  9. hdu1839之二分+邻接表+Dijkstra+队列优化

    Delay Constrained Maximum Capacity Path Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65 ...

随机推荐

  1. JAVA的基本程序设计结构<上>

    一个简单的Java应用程序 public class FirstSample { public static void main(String[] args) { System.out.println ...

  2. 20行代码教你用python给证件照换底色

    1.图片来源 该图片来源于百度图片,如果侵权,请联系我删除!图片仅用于知识交流.本文只是为了告诉大家:python其实有很多黑科技(牛逼的库),我们既可以用python处理工作中的一些事儿,同时我们也 ...

  3. MySQL--->存储引擎及图形化工具

    本章目标: 掌握MySQL存储引擎的特点 掌握Navicat图形化工具的使用 了解其他的一些图形化管理工具 1.存储引擎种类: 2. 表级锁和行级锁: 3.常见的引擎: InnoDB 存储引擎 MyI ...

  4. Git本地库既关联GitHub又关联Gitee

    创建代码仓库 使用gitee举例(github和gitee差不多) 1.在gitee右上角点击+,选择新建仓库

  5. JavaScript 回调函数的简单示例

    回调函数 回调函数也被称为高阶函数 所谓高阶函数,就是说值 函数作为参数被传递或者返回值输出 操作函数的函数称为 高阶函数 把一段可执行的代码(一个函数)作为参数传递给其他的代码(另一个函数),并在需 ...

  6. Probabilistic PCA、Kernel PCA以及t-SNE

    Probabilistic PCA 在之前的文章PCA与LDA介绍中介绍了PCA的基本原理,这一部分主要在此基础上进行扩展,在PCA中引入概率的元素,具体思路是对每个数据$\vec{x}_i$,假设$ ...

  7. Kinect+unity 实现体感格斗闯关小游戏

    文章目录 项目地址 1 项目概况 1.1 项目简介 1.2 项目目的 1.3 主要技术 2 设计 2.1 基本概念 2.2 框架 2.3 算法 2.4 模型 2.5 调查问卷 3 实现 3.1 技术难 ...

  8. Ansible常用模块-yum模块

    yum模块 name 必选 指定安装包名 state 执行命令  present  installed removed latest absent 其中installed and present等效 ...

  9. 自绘引擎时代,为什么Flutter能突出重围?

    导语 | Flutter 框架是当下非常热门的跨端解决方案,能够帮助开发者通过一套代码库高效构建多平台精美应用,支持移动.Web.桌面等多端开发.但仍然有很多产品.设计.甚至开发同学并不了解 Flut ...

  10. yb课堂之压力测试工具Jmeter5.X 实战《二十二》

    目前常用的测试工具对比 LoadRunner 性能稳定,压测结果及细粒度大,可以自定义脚本进行压力,但是太过于重大,功能比较繁多 Apache AB(单接口压测最方便) 模拟多线程并发请求,ab命令对 ...