版权声明:本篇随笔版权归作者Etta(http://www.cnblogs.com/Etta/)所有,转载请保留原地址! 

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

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

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

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

  垂直俯冲飞行 ∆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 秒,相应的飞行动作序列是:

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

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

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

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

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

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

现在小明驾驶华夏60 战斗机以V1 马赫的速度飞行于H1 英尺高度,中队长发出了让他以V2 马赫的速度飞行于H2 英尺高度的指令。请你编写程序帮小明决策一下如何飞行才能花费最少的时间执行完中队长下达的命令。

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

第一部分由一行构成,存放格式为:H1  V1  H2  V2  ∆h  Hm 。

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

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

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

注意:输入数据中所有的数据都是整数。

输出:

输出信息用两行来存放。第一行存放你求出的最优方案所需的时间。第二行存放该最优方案的动作序列(以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

一、分析问题

读完题用了很长的时间,但把它和图论联系起来想到建图的方法就不难。问题本质就是一个最短路,可以把每一个V与H的状态抽象为一个坐标点,用一维数组简化二维坐标加上队列SPFA 就水过去了O__O

二、解决问题

SPFA

三、代码实现

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<queue>
  4 using namespace std;
  5
  6 const int MA=2010,inf=4e8;
  7
  8 int h1,v1,h2,v2,st,en,dh,hm,n,m,t;
  9 int sum,k;
 10 int head[MA],dis[MA],ex[MA],pre[MA],w[MA];
 11 struct edge{
 12     int t,l,n,u;
 13 }e[MA];
 14 queue<int>q;
 15 char ch[]={' ','R','A','D'};
 16
 17 int calc(int a,int b)
 18 {
 19     return m*a+b;
 20 }
 21
 22 void build(int from,int to,int len,int u)
 23 {
 24     e[++sum].t=to;
 25     e[sum].u=u;
 26     e[sum].l=len;
 27     e[sum].n=head[from];
 28     head[from]=sum;
 29 }
 30
 31 void init()
 32 {
 33     scanf("%d%d%d%d%d%d",&h1,&v1,&h2,&v2,&dh,&hm);
 34     n=hm/dh;
 35     m=6;
 36     h1/=dh;st=calc(h1,v1);
 37     h2/=dh;en=calc(h2,v2);
 38
 39     for(int i=0;i<=n-1;++i)//恒速爬升
 40         for(int j=1;j<=6;++j)
 41         {
 42             scanf("%d",&t);
 43             int e=calc(i,j),f=calc(i+1,j);
 44             build(e,f,t,1);
 45         }
 46
 47     for(int i=0;i<=n;++i)//水平加速
 48         for(int j=1;j<=5;++j)
 49         {
 50             scanf("%d",&t);
 51             int e=calc(i,j),f=calc(i,j+1);
 52             build(e,f,t,2);
 53         }
 54
 55     for(int i=2;i<=n;++i)//垂直俯冲
 56         for(int j=1;j<=5;++j)
 57         {
 58             scanf("%d",&t);
 59             int e=calc(i,j),f=calc(i-1,j+1);
 60             build(e,f,t,3);
 61         }
 62 }
 63
 64 void SPFA()
 65 {
 66     for(int i=0;i<=(n+1)*m;++i)dis[i]=inf;
 67     dis[st]=0;
 68     q.push(st);
 69     while(!q.empty())
 70     {
 71         k=q.front();
 72         q.pop();
 73         ex[k]=0;
 74         for(int i=head[k];i;i=e[i].n)
 75         {
 76             if(dis[e[i].t]>=dis[k]+e[i].l)
 77             {
 78                 dis[e[i].t]=dis[k]+e[i].l;
 79                 w[e[i].t]=e[i].u;
 80                 pre[e[i].t]=k;
 81                 if(!ex[e[i].t])
 82                 {
 83                     ex[e[i].t]=1;
 84                     q.push(e[i].t);
 85                 }
 86             }
 87         }
 88     }
 89 }
 90
 91 void print(int x)
 92 {
 93     if(pre[x])print(pre[x]);
 94     if(w[x])printf("%c",ch[w[x]]);
 95 }
 96
 97 int main()
 98 {
 99     init();
100     SPFA();
101     printf("%d\n",dis[en]);
102     print(en);
103     printf("\n");
104     return 0;
105 }

转载于:https://www.cnblogs.com/Etta/p/6357490.html

【最短路】Aircraft相关推荐

  1. 【航线运输驾驶员理论考试】航空规章

    1.<中国民用航空法>的颁布目的 ①为了维护国家的领空主权和民用航空权利:② 保障民用航空活动安全和有秩序地进行:③保护民用航空活动当事人各方的合法权益:④促进民用航空事业的发展(The ...

  2. [C] [最短路] 只有5行的算法:Floyd-Warshall

    终于学到求最短路了,终于来到我最喜欢的算法--Floyd-Warshall了!今天还有点小激动呢! 我喜欢它,当然是因为它逻辑十分简单咯!真的只有5行诶! Floyd-Warshall算法 题目描述 ...

  3. BZOJ4152 AMPPZ2014 The Captain(最短路)

    事实上每次走到横坐标或纵坐标最接近的点一定可以取得最优方案.于是这样连边跑最短路就可以了. #include<iostream> #include<cstdio> #inclu ...

  4. Codeforces.1051F.The Shortest Statement(最短路Dijkstra)

    题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...

  5. BZOJ1491: [NOI2007]社交网络(Floyd 最短路计数)

    Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2343  Solved: 1266 [Submit][Status][Discuss] Descrip ...

  6. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  7. E:By Elevator or Stairs? CF595 DP最短路

    题目链接 比赛的时候一看,这不是最短路吗,然后敲了一个最短路. 然后比赛完发现大家基本都写的dp,我真是个憨憨,dp3行 最短路就建个简单的图,dp就是从上一维转化过来就是了 优秀的dp: //#pr ...

  8. The Shortest Statement CodeForces - 1051F LCA+最短路

    太弱了... 一开始看到题感觉是跑一个最小生成树在上边进行LCA就行了,但是发现过不了样例,然后就是就想到了之前做过类似做法的题目,就是非生成树上的边最多只有21条,然后就那些边记录下来,通过每一条边 ...

  9. JZOJ #4722 跳楼机 (最短路模型的完美转化)

    题目描述: 给出$h,x,y,z$,求在$h$以内,$x,y,z$可以凑出多少个不同的数.$(1\leq{h}\leq{10^{18}},1\leq{x,y,z}\leq{10^5})$ 解题思路: ...

最新文章

  1. 亚马逊机器学习服务:深入研究AWS SageMaker
  2. python里pickle模块
  3. linux vim编辑kconfig 无法wq,编译linux-3.15.5时遇到的几个错误
  4. C语言指针与数组之间的恩恩怨怨
  5. Vue第二部分(2):组件的嵌套与通信
  6. 7-1 输出从1加到N的和 (9 分)
  7. Ubuntu12.04上编译PlateGatewayQt
  8. 金三银五,金九银十,找工作的好时间
  9. delphi 运算符
  10. 摄影技术小白必须要掌握的基础知识(上)
  11. 不同时区时间换算_java中转换不同时区的时间
  12. Android中的工厂模式
  13. JAVAweb JSP飞机订票系统航空机票预订销售系统(机票预订系统)网上机票预订飞机订票
  14. 服务器信号有杂音怎么回事,麦克风有杂音或电流声等的解决方法
  15. 爬虫四步曲大神一步一步来教你,使用python抓取网页数据并储存
  16. 一、MicroApp快速入门示例
  17. 支持手机,滑动拖动验证
  18. mycafe目前服务器正在维护,【图片】咖啡厅全剧情记录(修正重发)【mycafe吧】_百度贴吧...
  19. 手机计算机的冷知识,冷知识:手机为什么能变得越来越智能?
  20. 小游戏:俄罗斯方块(Qt 5.9.8)

热门文章

  1. 编程艺术第二十三~四章十一续:杨氏矩阵查找,倒排索引关键词Hash编码
  2. ROS语音控制——小乌龟按设定图形路线运动
  3. python进行URL编码
  4. linux socket-recvfrom系统调用
  5. 没被中国足坛糟蹋的四大巨星
  6. 【计算机毕业设计】社区医疗服务系统
  7. linux 打开.v文件,VSV 文件扩展名: 它是什么以及如何打开它?
  8. 【图论】Angry Birds——BSOJ 2900
  9. 元宇宙中的情绪与情感探索在军事上的应用
  10. 河南工程学院2022级新生周赛(三)题解