华夏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短路的文章,那时候还不明白为什么还可以把所有点重复的放入堆中,只知道那样求出来的就是对的.知其然不知其所以然是件容易引发伤痛的 ...
随机推荐
- 【安装配置Redis】
目录 安装 配置 Redis官网:https://redis.io Redis是完全开源免费的,遵守BSD协议. Redis是一个高性能的key-value数据库. @ *** Redis具有以下特点 ...
- LeetCode 856 递归思路详解
题目描述 给定一个平衡括号字符串 S,按下述规则计算该字符串的分数: () 得 1 分. AB 得 A + B 分,其中 A 和 B 是平衡括号字符串. (A) 得 2 * A 分,其中 A 是平衡括 ...
- (转)C++引用
前言:引用是C++一个很重要的特性,最近看了很多有关引用的资料和博客,故在此对引用的相关知识进行总结 一.什么是引用 引用,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作 ...
- Jquery-操作select下拉菜单
jQuery获取Select选择的Text和Value: 1. var checkText=jQuery("#select_id").find("option:selec ...
- HTML5与后台服务器的数据流动问题
编辑中,尚未完稿...2017.7.14 1345 很多前端开发出来的HTML5可能对于后台开发者来说,并不是很清楚,也许像我一样一知半解.而且真的让人很糊涂的地方就是前端的JS如何与后端的数据库进行 ...
- 10.2.0.4 to 10.2.0.5 Installation of Patch Set Release (Windows)
环境:10.2.0.4集群数据库zlm10g(双节点,zlm10g1,zlm10g2) 系统:Windows 2003 Server 64Bit 内存:2G RAM 存储:ASM 目标:把集群数据库从 ...
- HDU 4418 高斯消元法求概率DP
把两种状态化成2*n-2的一条线上的一种状态即可.很容易想到. 高斯列主元法,不知为什么WA.要上课了,不玩了...逃了一次课呢.. #include <iostream> #includ ...
- 【struts2】struts2中的流接收与流发送
[前言]在我们的struts2后端中,实现流的接收和发送.就能够实现向server传视频流以及下载图片. [流接收] 如今举一个传公钥的样例.struts2用一个action接收Key,而Key就是用 ...
- D3D 线列 小样例
画两条线 #pragma once #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib" ...
- 003.JMS概述
1. 基本概念 JMS:Java Message Service, Java消息服务,是Java EE中的一个技术. JMS规范:JMS定义了Java中访问消息中间件的接口,并没有给予实现,实现JMS ...