华夏60 战斗机(最短路dijkstra)
华夏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) 第一部分由一行构成,存放格式为:H1 V1 H2 V2 ∆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)的更多相关文章
- 洛谷 - P2551 - 华夏60战斗机 - 简单dp
https://www.luogu.org/problemnew/show/P2551 首先这道题没有给Hm的最大值,很坑,只能随便开一个100没想到还过了. 观察题目,发现虽然高度可以变化,但是速度 ...
- hdu 2544 最短路 Dijkstra
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间, ...
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...
- 单源最短路dijkstra算法&&优化史
一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...
- HUD.2544 最短路 (Dijkstra)
HUD.2544 最短路 (Dijkstra) 题意分析 1表示起点,n表示起点(或者颠倒过来也可以) 建立无向图 从n或者1跑dij即可. 代码总览 #include <bits/stdc++ ...
- 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树)
layout: post title: 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树) author: "luowentaoaa" ca ...
- 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)
layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...
- 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)
layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...
- 最短路Dijkstra算法的一些扩展问题
最短路Dijkstra算法的一些扩展问题 很早以前写过关于A*求k短路的文章,那时候还不明白为什么还可以把所有点重复的放入堆中,只知道那样求出来的就是对的.知其然不知其所以然是件容易引发伤痛的 ...
随机推荐
- MySQL主从宕机的解决方法
测试系统:centos6.5系统 测试环境IP地址划分: master: 192.168.80.130 slave:192.168.80.143 slave:192.168.80.146 首先模拟(M ...
- 基于S5PC100的FIMC控制器解析
作者:邹南,华清远见嵌入式学院讲师. http://www.cnblogs.com/gooogleman/archive/2012/07/26/2610449.html CAMERA SENSOR O ...
- 线性回归(regression)
简介 回归分析只涉及到两个变量的,称一元回归分析.一元回归的主要任务是从两个相关变量中的一个变量去估计另一个变量,被估计的变量,称因变量,可设为Y:估计出的变量,称自变量,设为X. 回归分析就是要找出 ...
- Python学习笔记(4)列表
2019-02-26 列表(list):①创建方法:用‘[ ]’,将数据包括起来,数据之间用逗号隔开.②空列表:empty = []③增删改查: 1)增加: a.append()方法——将元素添加到列 ...
- 【Codeforces Round #499 (Div. 1) B】Rocket
[链接] 我是链接,点我呀:) [题意] 让你猜到火星的距离x是多少. 已知1<=x<=m 然后你可以问系统最多60个问题 问题的形式以一个整数y表示 然后系统会回答你3种结果 -1 x& ...
- Java基础学习总结(33)——Java8 十大新特性详解
Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...
- [terry笔记]Oracle SQL 优化之sql tuning advisor (STA)
前言:经常可以碰到优化sql的需求,开发人员直接扔过来一个SQL让DBA优化,然后怎么办? 当然,经验丰富的DBA可以从各种方向下手,有时通过建立正确索引即可获得很好的优化效果,但是那些复杂SQL错综 ...
- 2015 Multi-University Training Contest 4 hdu 5334 Virtual Participation
Virtual Participation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- Nodejs RESTFul架构实践之api篇(转)
why token based auth? 此段摘自 http://zhuanlan.zhihu.com/FrontendMagazine/19920223 英文原文 http://code.tuts ...
- [Tools] Create your own mobile emulator device by using Chrome dev tool
Using the New Device Emulation Interface The Device Emulation interface changed a bit with the newer ...