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