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. 3月28日考试 题解(二分答案+树形DP+数学(高精))

    前言:考试挂了很多分,难受…… --------------------- T1:防御 题意简述:给一条长度为$n$的序列,第$i$个数的值为$a[i]$.现让你将序列分成$m$段,且让和最小的一段尽 ...

  2. Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:testCompile (default-testCompile) on project docker_springcloud_demo: Fatal error compiling: 无效的标记: -parameters -> [Help 1]

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:testCompile (def ...

  3. 比原链(Bytom)正式开源Bytom-JavaScript库

    12月13日,比原链(Bytom)正式开源Bytom-JavaScript库,这个库是官方原生支持的新一代JavaScript SDK接口.JavaScript是世界上最多人使用的解释性脚本语言,JS ...

  4. Spring IOC 原理深层解析

    1 Spring IOC概念认识 1.1 区别IOC与DI 首先我们要知道IOC(Inverse of Control:控制反转)是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spri ...

  5. QT QJson与QByteArray的转化

    目录 QJsonObject转为QByteArray QByteArray转为QJsonObject 可以将QJsonObject与QByteArray互相转化,以便网络编程时客户端与服务器之间的通信 ...

  6. 2020-07-04:tcp三次握手干了啥?time_wait什么时候出现?

    福哥答案2020-07-04:三次握手如下:1.SYN j2.ACK j+1,SYN k3.ACK k+1 time_wait出现在断开连接第四次挥手的时候出现.TIME_WAIT状态存在有两个原因. ...

  7. 代码优化之return 减少括号嵌套

    代码优化之return 减少括号嵌套   例如下面的公共方法 // 优化 substring方法   解决边界越界问题 空指针问题 优化前 public static String subString ...

  8. C#LeetCode刷题之#16-最接近的三数之和(3Sum Closest)

    目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3620 访问. 给定一个包括 n 个整数的 ...

  9. C#LeetCode刷题之#350-两个数组的交集 II(Intersection of Two Arrays II)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4044 访问. 给定两个数组,编写一个函数来计算它们的交集. 输入 ...

  10. C#LeetCode刷题之#242-有效的字母异位词(Valid Anagram)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4040 访问. 给定两个字符串 s 和 t ,编写一个函数来判断 ...