flight planning
你的任务是写一个程序来完成飞机的飞行计划. 每一次飞行都可以被分为一系列的航段。你的程序必须对每一航段选出最佳的飞行高度,以最小化航程中需要消耗的燃料。
飞机的空速是给定的,我们将用VCRUISE来描述。以及一个效果最佳的飞行高度AOPT(单位为英尺)。当飞机以海拔为AOPT的高度飞行时,每小时将消耗燃料GPHOPT加仑。如果飞机不在AOPT高度飞行,每低于或高于AOPT 1000英尺,每小时消耗的燃料就会额外增加GPHEXTRA加仑。飞机的起飞前的高度、降落后的高度均为0. 飞机的飞行高度每提升1000英尺,燃料就会消耗CLIMBCOST加仑(飞行高度下降是不需要消耗燃料的),为了简化问题,我们认为飞机的飞行高度变化是瞬间完成的。以上的所有参数,在下表中给出:
VCRUSITE 400 海里 / 小时
AOPT 30,000 英尺
GPHOPT 2000 加仑 / 小时
GPHEXTRA 10 加仑 / 1000英尺
CLIMBCOST 50 加仑 / 1000英尺
每次飞行前,你都会得知每一航段的长度,以及每一航段的风速。风速并不是确定的,具体地说,它由飞机在该航段的飞行高度决定,并且是一个关于飞行高度的线性函数。例如,如果飞机的空速是400海里/小时,而风速是-50海里/小时时,飞机的实际对地速度就是350海里/小时。
由于某些特殊的规定,飞机在每一航段的飞行高度必须在20,000英尺~40,000英尺之间,且必须是1000英尺的整数倍。你的程序需要在最小化消耗燃料的前提下,输出每一航段的飞行高度,以及消耗的最少燃料。
输入格式
第一行一个整数N,表示有N组数据。
对于每组数据,第一行包含一个整数K(K≤100),描述航段数量。
接下来K行,每行3个整数A、B、C,分别描述该航段的长度(单位为海里)、在20,000英尺时的风速(单位为海里/小时)、在40,000英尺时的风速。
输出格式
对于每组数据,输出一行,共k+1个整数。前k个整数分别描述每个航段的飞行高度(单位为1000英尺),最后一个整数描述消耗的最少燃料,由于答案有可能是实数,请对答案取上整后输出。如果有多种方案满足要求,请选择字典序最小的方案(例如当 K = 2 时,有2种方案(30, 40) 和 (20, 30),则输出(20, 30))。具体格式见样例输出。
样例输入
2
2
1500 -50 50
1000 0 0
3
1000 50 0
2000 0 20
1800 50 100
样例输出
Flight 1: 35 30 13986
Flight 2: 20 30 30 23502
数据规模和约定
K≤100,A≤100,000,|B|、|C|≤100
#include<stdio.h> void print(int id,int hopt[][57],int K) {if(!K)return ;print(hopt[K][id],hopt,K-1);printf(" %d",id); } int main() {int VCRUSITE=400,AOPT=30,GPHOPT=2000,GPHEXTRA=10,CLIMBCOST=50;double hcons[57],relaVCRUSITE[57],min,wcamo;int minid;int i,j,k,o;double N,A,B,C;int K;double opt[157][57];int consopt[157][57];double noif,t;for(i=0;i<57;++i){hcons[i]=0;for(j=0;j<157;++j)opt[j][i]=0;}for(i=0;i<21;++i)hcons[AOPT+i]=hcons[AOPT-i]=2000+i*GPHEXTRA;scanf("%lf",&N);for(i=0;i<N;++i){scanf("%d",&K);for(j=1;j<K+1;++j){scanf("%lf %lf %lf",&A,&B,&C);relaVCRUSITE[20]=VCRUSITE+B;wcamo=(C-B)/20;for(k=21;k<41;++k)relaVCRUSITE[k]=relaVCRUSITE[k-1]+wcamo;for(k=20;k<41;++k){opt[j][k]=99999999;for(o=20;o<41;++o){noif=o<k?(k-o):0;noif+=((j-1)==0)*k;t=A/relaVCRUSITE[k]*hcons[k]+opt[j-1][o]+noif*CLIMBCOST;if(t<opt[j][k]){opt[j][k]=t;consopt[j][k]=o;}}}}min=opt[K][20];minid=20;for(j=21;j<41;++j)if(min>opt[K][j]){min=opt[K][j];minid=j;}printf("Flight %d:",i+1);print(minid,consopt,K);printf(" %d\n",(int)(min+1));}return 0; }
总结
以上是生活随笔为你收集整理的flight planning的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: android网页打印,安卓网页打印,h
- 下一篇: 用python判断平闰年 ,深入理解 o