华夏60 战斗机(最短路dijkstra)

华夏60 超音速战斗机是当今世界上机动性能最先进的战斗机。战斗过程中的一个关键问题是如何在最短的时间内使飞机从当前的飞行高度和速度爬升/俯冲到指定的高度并达到指定速度,以便占据有利的战斗位置。

现假定只允许华夏60 执行以下三种基本飞行动作,并且只能在完成了一个基本动作的情况下再去执行另一个基本飞行动作。这样华夏60 的飞行可以表示成由这三种基本飞行动作组成的动作序列。

(1)      维持原速做恒速爬升飞行,直至飞行高度提高 ∆h 英尺;

(2)      水平加速飞直至速度提高1 马赫(1 马赫 ≈ 1200 公里/小时);

(3)      垂直俯冲飞行 ∆h 英尺,飞行速度会提高1 马赫。

同时假定飞机的初始飞行速度和执行每个基本飞行动作初始时刻的飞行速度都是1 马赫的整数倍,且不超过6 马赫;初始飞行高度和执行每个基本飞行动作初始时刻的飞行高度都为 ∆h 英尺( ∆h 是整数)的整数倍。

实验研究表明:在不同高度H 和不同的初始速度V 完成上述的三种基本飞行动作所需的时间也是各不相同的。表1~表3 给出了∆h = 15000英尺和最大飞行高度Hm = 75000英尺时完成这三种基本飞行动作所需的时间。

表1 恒速爬升飞行

V

H

1

2

3

4

5

6

0

12

12

12

11

12

14

15000

11

10

8

9

10

11

30000

9

8

6

7

8

8

45000

8

7

6

6

6

5

60000

8

6

6

6

6

5

表2 水平加速飞行

V

H

1

2

3

4

5

0

11

11

11

13

15

15000

10

10

9

9

10

30000

10

9

9

10

10

45000

9

8

9

9

10

60000

7

8

8

9

9

75000

7

7

7

8

8

表3 垂直俯冲飞行

V

H

1

2

3

4

5

30000

5

4

3

3

2

45000

4

3

3

2

2

60000

3

3

2

2

2

75000

3

3

2

2

2

根据表1~表3 的数据,欲使华夏60 战斗机从H = 0 英尺、V = 1 马赫的飞行状态达到H = 75000英尺、V = 6马赫的飞行状态的最短飞行时间是79 秒,相应的飞行动作序列是:

(1)      恒速爬升飞行至15000 = H 英尺, 1 = V 马赫状态;

(2)      连续做两次水平加速飞行至H = 15000英尺, V = 3 马赫状态;

(3)      连续做四次恒速爬升飞行至H = 75000英尺, V = 3马赫状态;

(4)      水平加速飞行至 H = 75000 英尺, V = 4马赫状态;

(5)      连续做两次垂直俯冲飞行至H = 45000英尺, V = 6马赫状态;

(6)      连续做两次恒速爬升飞行至H = 75000英尺, V = 6马赫状态。

现在小明驾驶华夏60 战斗机以V1马赫的速度飞行于H1英尺高度,中队

长发出了让他以V2马赫的速度飞行于H2英尺高度的指令。请你编写程序帮

小明决策一下如何飞行才能花费最少的时间执行完中队长下达的命令。

输入:文件由四部分组成。

(1)      第一部分由一行构成,存放格式为:HVHV2  ∆h  Hm

(2)      第二部分存放了表1 的内容,共有 Hm /∆h 行,每行有6 列。表中第i 行、第j 列的数据表示华夏60 战斗机在 ∆h*(i-1) 英尺的高度以j马赫的速度做恒速爬升飞行,飞行高度提高∆h英尺所需的时间。

(3)      第三部分存放了表2 的内容,共有 Hm /∆h+1 行,每行有5 列。表中第i 行、第j 列的数据表示华夏60 战斗机在 ∆h*(i-1) 英尺的高度以j 马赫的初始速度做水平加速飞行,飞行速度提高1 马赫所需要的时间。

(4)      第四部分存放了表3 的内容,共有 Hm /∆h-1 行,每行有5 列。表中第i 行、第j 列的数据表示华夏60 战斗机在 ∆h*(i+1) 英尺的高度以j 的初始速度做垂直俯冲飞行,飞行高度降低∆h英尺所需的时间。

注意:输入数据中所有的数据都是整数。Hm/∆h<=50

输出

输出信息用两行来存放。第一行存放你求出的最优方案所需的时间。第二行存放该最优方案的动作序列(以R 表示恒速爬升飞行,A 表示水平加速飞行,D 表示垂直俯冲飞行)。第二行中不允许出现多余的字符(包括空白字符)。

例如:

输入

0 1 75000 6 15000 75000

12 12 12 11 12 14

11 10 8 9 10 11

9 8 6 7 8 8

8 7 6 6 6 5

8 6 6 6 6 5

11 11 11 13 15

10 10 9 9 10

10 9 9 10 10

9 8 9 9 10

7 8 8 9 9

7 7 7 8 8

5 4 3 3 2

4 3 3 2 2

3 3 2 2 2

3 3 2 2 2

输出

79

RAARRRRADDRR

解题报告

光是看题目就让人不想做。但仔细分析一下,其实就是一个最短路的问题。那么怎么建模呢,这和平时的最短路有所不同。不妨把每一个状态当做一个点,包含 高度与速度两个参数,那么,表格里的每一个数据都相当于连接两个状态的一条边,权值为时间。这样最大也只会产生300个点。用堆优化的dijkstra完全可以胜任。

#include<bits/stdc++.h>
#define Pair pair<int,pair<int,int> >
#define MAXN 300+10
#define MAXM 90000+10
using namespace std;
int n,m,num,head[MAXN][MAXN],dis[MAXN][MAXN],vis[MAXN][MAXN],hm,dh,pre[MAXN][MAXN];
int ans[MAXN];
pair<int,int> s,t;
struct Edge{
int dis,next,exi,n;
pair<int,int> to,from;
}edge[MAXM];
void add(pair<int,int> from,pair<int,int> to,int dis,int n)
{
edge[++num].next=head[from.first][from.second];
edge[num].to=to;
edge[num].dis=dis;
edge[num].n=n;
edge[num].from=from;
head[from.first][from.second]=num;
}
void dij()
{
memset(dis,,sizeof(dis));
memset(vis,,sizeof(vis));
priority_queue<Pair,vector<Pair>,greater<Pair> > h;
for(int i=;i<=;i++)
for(int j=;j<=m;j++)
dis[i][j]=;
dis[s.first][s.second]=;
h.push(Pair(dis[s.first][s.second],s));
while(h.size()>)
{
pair<int,int> k=h.top().second;h.pop();
if(vis[k.first][k.second]) continue;
vis[k.first][k.second]=;
for(int i=head[k.first][k.second];i;i=edge[i].next)
if(dis[k.first][k.second]+edge[i].dis<=dis[edge[i].to.first][edge[i].to.second])
{
dis[edge[i].to.first][edge[i].to.second]=dis[k.first][k.second]+edge[i].dis;
pre[edge[i].to.first][edge[i].to.second]=i;
h.push(Pair(dis[edge[i].to.first][edge[i].to.second],edge[i].to));
}
}
} int main()
{
freopen("airfract.in","r",stdin);
freopen("airfract.out","w",stdout);
scanf("%d%d%d%d%d%d",&s.second,&s.first,&t.second,&t.first,&dh,&hm);
m=hm/dh;s.second/=dh;t.second/=dh;
for(int h=;h<=m-;h++)
{
for(int v=;v<=;v++)
{
int x;
pair<int,int> a,b;
scanf("%d",&x);
a.first=v;a.second=h;
b.first=v;b.second=h+;
add(a,b,x,'R');
}
} for(int h=;h<=m;h++)
{
for(int v=;v<=;v++)
{
int x;pair<int,int> a,b;
scanf("%d",&x);
a.first=v;a.second=h;
b.first=v+;b.second=h;
add(a,b,x,'A');
}
}
for(int h=;h<=m;h++)
{
for(int v=;v<=;v++)
{
int x;pair<int,int> a,b;
scanf("%d",&x);
a.first=v;a.second=h;
b.first=v+;b.second=h-;
add(a,b,x,'D');
}
}
dij();
printf("%d\n",dis[t.first][t.second]); for(int i=pre[t.first][t.second];i;i=pre[edge[i].from.first][edge[i].from.second])
ans[++ans[]]=edge[i].n;
for(int i=ans[];i>=;i--)
{
printf("%c",ans[i]);
}printf("\n");
return ;
}

华夏60 战斗机(最短路dijkstra)的更多相关文章

  1. 洛谷 - P2551 - 华夏60战斗机 - 简单dp

    https://www.luogu.org/problemnew/show/P2551 首先这道题没有给Hm的最大值,很坑,只能随便开一个100没想到还过了. 观察题目,发现虽然高度可以变化,但是速度 ...

  2. hdu 2544 最短路 Dijkstra

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间, ...

  3. 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法

    图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...

  4. 单源最短路dijkstra算法&&优化史

    一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...

  5. HUD.2544 最短路 (Dijkstra)

    HUD.2544 最短路 (Dijkstra) 题意分析 1表示起点,n表示起点(或者颠倒过来也可以) 建立无向图 从n或者1跑dij即可. 代码总览 #include <bits/stdc++ ...

  6. 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树)

    layout: post title: 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树) author: "luowentaoaa" ca ...

  7. 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

    layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...

  8. 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

    layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...

  9. 最短路Dijkstra算法的一些扩展问题

    最短路Dijkstra算法的一些扩展问题     很早以前写过关于A*求k短路的文章,那时候还不明白为什么还可以把所有点重复的放入堆中,只知道那样求出来的就是对的.知其然不知其所以然是件容易引发伤痛的 ...

随机推荐

  1. thinkphp 同一字段不同查询条件实现

    搞定了 另外区间查询还可以支持更多的条件,只要是针对一个字段的条件都可以写到一起,例如:$map['name'] = array(array('like','%a%'), array('like',' ...

  2. github上Devstack的一些变动,截至8.20

    从github下直接clone下来的代码在执行之前须要对一些文件进行改动,否则会出现关于REQUIREMENTS的错误 说明:代码前边是"-"号的,须要删除,代码前边是" ...

  3. C++11时间具体解释

    转载请注明出处:http://blog.csdn.net/luotuo44/article/details/46854229 C++ 11添加了三个与时间相关的类型:时间段.时钟.时间点. 以史为鉴 ...

  4. 更换oracle 集群网卡(Changing a Network Interface)

     更换oracle 集群网卡(Changing a Network Interface) 假设换网卡前后 网卡名.ip,网关,子网掩码都不变的话,集群层面不许要做额外的操作. 一下操作为更换网卡后 ...

  5. LeetCode——Copy List with Random Pointer

    A linked list is given such that each node contains an additional random pointer which could point t ...

  6. Android 启动界面的制作

    直接看实例吧 package com.example.textview; import android.app.Activity; import android.content.Intent; imp ...

  7. UBUNTU 16.04 下安装动态链接库方法(使用ln命令可以随意映射动态库,ldd查看缺少的动态库)

    一般先使用ldd 来查看该应用程序缺少什么东西,然后,再根据sudo apt install XXX 去安装相应的动态库. 假如没有对应的库,可以使用: sudo ln -s /usr/lib/lib ...

  8. [NOI.AC#32]sort 构造

    链接 50分做法(只有0,1) 根据归并排序的思想,假设我们现在已经把 \(l\dots mid\) 和 \(mid+1\dots r\) 排好序 只要把左边连续的1和右边连续的0翻转即可 inlin ...

  9. javascript系列-class4.函数

    欢迎加入前端交流群来py: 转载请标明出处!                   在火影的世界中存在忍术,忍术是把强大的能量集中在一起以各种各样不同的形式发射出来.怎样使用各种各样的忍术那?通过结印. ...

  10. MHA+ProxySQL 读写分离高可用

    文档结构如下: 1.ProxySQL说明 ProxySQL是mysql的一款中间件的产品,是灵活的mysql代理层,可以实现读写分离,支持query路由器的功能,支持动态指定sql进行缓存,支持动态加 ...