华夏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)      第一部分由一行构成,存放格式为: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,0,sizeof(dis));
    memset(vis,0,sizeof(vis));
    priority_queue<Pair,vector<Pair>,greater<Pair> > h;
    for(int i=0;i<=6;i++)
        for(int j=0;j<=m;j++)
     dis[i][j]=2147483647;
    dis[s.first][s.second]=0;
    h.push(Pair(dis[s.first][s.second],s));
    while(h.size()>0)
    {
        pair<int,int> k=h.top().second;h.pop();
        if(vis[k.first][k.second]) continue;
        vis[k.first][k.second]=1;
        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=0;h<=m-1;h++)
    {
        for(int v=1;v<=6;v++)
        {
            int x;
            pair<int,int> a,b;
            scanf("%d",&x);
            a.first=v;a.second=h;
            b.first=v;b.second=h+1;
            add(a,b,x,‘R‘);
        }
    }

    for(int h=0;h<=m;h++)
    {
        for(int v=1;v<=5;v++)
        {
            int x;pair<int,int> a,b;
            scanf("%d",&x);
            a.first=v;a.second=h;
            b.first=v+1;b.second=h;
            add(a,b,x,‘A‘);
        }
    }
    for(int h=2;h<=m;h++)
    {
        for(int v=1;v<=5;v++)
        {
            int x;pair<int,int> a,b;
            scanf("%d",&x);
            a.first=v;a.second=h;
            b.first=v+1;b.second=h-1;
            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[0]]=edge[i].n;
    for(int i=ans[0];i>=1;i--)
    {
        printf("%c",ans[i]);
    }printf("\n");
    return 0;
}
				
时间: 2024-07-28 15:52:32

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

uva 10801 - Lift Hopping(最短路Dijkstra)

1 /* 2 题目大意: 3 就是一幢大厦中有0-99的楼层, 然后有1-5个电梯!每个电梯有一定的上升或下降速度和楼层的停止的位置! 4 问从第0层楼到第k层最少经过多长时间到达! 5 6 思路:明显的Dijkstra ,在建图的时候u->v可能有多个电梯到达,取时间最少的当作路径的权值! 7 如果我们发现 d[i] > d[j] + map[j][i] + 60, 那么说明从第0层到达第 i 层的时间大于从第j层 8 转移到其他电梯然后到达第 i 层的时间,那么就更新d[i]的值! 9 1

POJ1062 Expensive dowry 【最短路dijkstra】

详细看:http://blog.csdn.net/lyy289065406/article/details/6645852 简单说一下:每个物品是一个结点,边的权值是,edge[u][v]的值表示用物品u换物品v的价格 一开始所有物品都置为原价,即所有dist[i]为原价,用dijkstra算法,算出0点(啥物品都没有)到各点的最短距离,求出dist[1]即为花费 枚举每个物品的等级为这条交易链的最高等级,把所有等级高于它的或者比它小超过等级限制的点都剔除,可以用bool数组剔除,然后用上述的d

POJ 2387 Til the Cows Come Home (最短路+Dijkstra)

Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29550   Accepted: 9935 Description Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the

POJ-3268-最短路(dijkstra算法)

Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12494   Accepted: 5568 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X

hdu 2544 最短路 Dijkstra

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间,要求输出起点到终点的最短时间. /* 最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 35043 Accepted Submission

最短路Dijkstra和Flyod

Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M& lt;=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表 示输入结束.接下来

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA)

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n,树根为编号1,选择一些边,使得所有节点构成一棵树,选择边的代价是(子孙的点的重量)×(这条边的价值).求代价最小多少. 分析: 单看每个点被计算过的代价,很明显就是从根到节点的边的价值.所以这是个简单的单源最短路问题. 不过坑点还是很多的. 点的数量高达5w个,用矩阵存不行,只能用边存. 还有路径和结

最短路——dijkstra

                                   最短路--dijkstra                 这次写一下我用dijkstra算法做单源最短路的经历.             首先先引入一个问题:给你两个数 m,n.n代表一共有n个村庄.之后有m行,每行包含三个数 from,to,dist.这三个数代表着,从村庄from到村庄to有dist 这么长的距离,此为无向图.           现在想知道从村庄1到村庄n的最短的路径是多少.           相关题

hdu4849 Wow! Such City!(最短路dijkstra)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4849 Problem Description Doge, tired of being a popular image on internet, is considering moving to another city for a new way of life. In his co