1027. 戴绿帽子的空管
Description
幽會計劃
二哥如今在TNCM機場做空管。二哥不幸被分配到了進近席,進近席位要負責處理所有準備降落在機場的飛機,讓他們平穩地落在跑道上。飛機降落一般遵循五邊進近航圖,不過在這道題目中你不需要關心什么是五邊進近,只要看下面這張圖。
一架飛機總是從下滑道入口(A點)開始接受二哥管制,直到降落成功(B點)。飛機不會是同一型號的,速度也不一樣,所以從A點到B點所需的時間不同。二哥得小心一點,不能把事情搞砸了:(1)下滑道內不允許飛機互相超越;(2)一架飛機降落之后,至少要等待一段時間才允許下一架飛機降落(即到達B的時間間隔要大于等于一個值)。
二哥是個聰明的人,他寫了一個程序來幫他控制所有飛機,然后他就可以喝茶去了。二哥的策略是:通過拒絕某些飛機進入下滑道,來保證下滑道上的飛機永遠不會距離太近。也就是說,只要飛機被允許進入下滑道,就可以安全降落。
每當一架飛機來到下滑道的入口時,二哥的程序就會判斷:如果允許這架飛機進入下滑道,它能否安全降落。如果能安全降落,二哥就允許他進入下滑道,否則二哥會立即要求這架飛機在A點復飛。
原則上,兩架飛機不應該同時出現在A點,但這種情況顯然可能出現。如果真的出現了這種情況,則說明空管局這次徹底把事情搞砸,二哥的策略顯然可能是誘因。
簡單來說,在未來的一段時間內,共有N架飛機要降落,他們會在Ti時刻首次出現在下滑道入口,他們從A點到B點需要的時間為Ui。如果他們被二哥命令在A點復飛,他們會在Gi分鐘后再次出現在下滑道入口。飛機的安全降落間隔是S。
現在,二哥的女朋友找到你,請你計算一下每架飛機會在第幾分鐘完成降落。這樣她可以估算出二哥什么時候下班,以便瞞著二哥去和情人去幽會。
Input Format
第一行有三個正整數N、MAX、S,表示有多少飛機,最長模擬的時間,以及安全降落時間間隔。
之后有N行,每行有三個非負整數,依次為Ti、Ui、Gi,分別表示第i架飛機的首次到達時間、從A點到B點耗時、復飛耗時。
N≤1000
MAX≤1000000 S≤1000 Ti≤1000000 ,Ui≤1000 ,Gi≤1000
Output Format
假設在MAX時刻之前([0..MAX-1]),有飛機同時出現在了下滑道口,則輸出“CHANGE BOYFRIEND”,因為飛機撞了,三哥估計要下崗了,她可以換一個男朋友了。
假設在MAX時刻之前沒有飛機相撞,但模擬結束后仍然有飛機沒有降落,則輸出一行“GO DATING”,以表示三哥的女朋友可以放心大膽地幽會去了。
否則輸出N行,每行一個整數,表示第i架飛機最終降落的時刻。
Sample Input
4 20 2
0 2 5
1 2 1
5 2 1
6 10 10
Sample Output
2
4
7
16
Sample Input
3 10 2
0 2 5
1 2 3
4 1 1
Sample Output
CHANGE BOYFRIEND
樣例解釋
分析:0時刻,第一架飛機到達A,二哥允許他進入下滑道,在第2時刻降落。1時刻,第二架飛機到達A,二哥要求他復飛,因為降落間距小于安全標準。2時刻,第二架飛機復飛后再次回到A,二哥允許他進入下滑道,在第4時刻降落。5時刻,第三架飛機到達A,二哥允許他進入下滑道,在第7時刻降落6時刻,第四架飛機到達A,二哥允許他降落,在第16時刻降落。分析:在4時刻,第二架飛機和第三架飛機會相撞。
#include <iostream> #include <vector> #include <algorithm> #include <map>using namespace std;class Fly{ public:int id,in,out,repStay;Fly(int fid,int a, int b, int c){id = fid;in = a;out = b;repStay = c;}Fly(){}; };int main() {int n,Max,s,N;cin>>n>>Max>>s;N = n;map<int, Fly> fly;int fid = 0;while(n-->0){int in,out,repStay;cin>>in>>out>>repStay;fly[in] = Fly(fid,in,out,repStay);fid++;}int res[N];map<int, Fly>::iterator iter = fly.begin();int lastLoad = iter->second.in + iter->second.out;iter++;res[0] = lastLoad;while(iter != fly.end()){if(iter->second.in>=Max){cout<<"GO DATING";return 0;}int achi = iter->second.in + iter->second.out;if(achi-lastLoad>=s){res[iter->second.id] = achi;lastLoad = achi;}else{int n_in = iter->second.in + iter->second.repStay;if(fly.count(n_in)>0){cout<<"CHANGE BOYFRIEND";return 0;}else{fly[n_in] = Fly(iter->second.id, n_in, iter->second.out, iter->second.repStay);}}iter++;}for(int i=0;i<N;i++)cout<<res[i]<<" "<<endl;return 0; }
?
轉載于:https://www.cnblogs.com/bernieloveslife/p/7890136.html
總結
以上是生活随笔為你收集整理的1027. 戴绿帽子的空管的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 草房子的作者是谁啊?
- 下一篇: gulp-load-task 解决 gu