寒假作業3

2022-03-24 07:44:32 字數 3312 閱讀 3737

#電梯公升降問題

>[github倉庫位址](

問題a思路鏈結

一棟10層的大樓(樓層編號1-10),設有一台無限載重的電梯,初始時電梯停在1層。電梯移動1層的耗時為1,在某一層停靠的耗時為1(時間初始為0)。為了使得乘客等待的時間(電梯在目的層的停靠時刻 - 乘客發出請求時刻)總和最小,請你編寫乙個程式來進行電梯排程。

輸入有5個請求,每個請求一行,格式為請求時刻 起始樓層數 去往方向,其中方向為0代表向上去往10層,為1代表向下去往1層。

輸出每次對應的決策,每一行的輸出格式為xx時,停靠在x樓。其中,「xx時刻」指的是在某層樓停靠的時刻,且不算入在該層的停靠時間。如:

當0時刻時,電梯此時在1層,輸入有0 1 0,那麼電梯從1層接客(1s)前往10層(9s),應輸出10時,停靠在10樓(1+9=10)。此時,該乘客等待時間為(10-0=)10。

當0時刻,電梯此時在1層,輸入有0 2 0,那麼電梯從1層前往2層(1s),接上乘客(1s),前往10層(8s),應輸出10時,停靠在10樓(1+1+8=10)。此時,該乘客等待時間為(10-0=)10s。

最後輸出完成5個請求(所有乘客都到達目的地)後,各乘客的等待時間總和。

請自己設計5組測試用例,且具有一定代表性,用以驗證程式是否是最小耗時。

要求:一、 輸入從檔案讀取,輸出是寫入檔案。

大家在學習 c 語言的時候,應該明白了控制台程式的輸入和輸出。但檔案操作往往是之前的課程中被忽略的乙個部分,大家有沒有試過「如果我要將程式的輸出儲存下來」、「如果我要從乙個檔案中獲得輸入」這些實操的環節呢?如果沒有,現在是乙個再好不過的學習機會,來吧,learning by doing!

要求:輸入輸出改成檔案輸入輸出操作。輸入檔案的檔名為 input.txt 裡面儲存著輸入樣例,乙個輸入為一行,輸入的格式見作業的第二條要求。

例如:0 1 5 2 2 5

程式輸出每次對應的決策,每一行的輸出格式為 xx時,停靠在x樓。輸出在檔名為output.txt的檔案中。

二、這次的乘客不再像上一次作業那樣只會去頂樓或者是 1 樓了,現在要使我們的程式功能更加貼近現實。

迭代:乘客會前往任意一層,請修改程式**並實現。自然,輸入請求就變為了:每個請求一行,格式為 請求時刻 起始樓層數 去往樓層 。同樣,大家也需要自己構造測試樣例,讓這台「電梯」盡可能好的工作。構造五個輸入樣例,最後輸出完成五個請求(所有乘客都到達目的地)後,各乘客的等待時間總和。輸入輸出的詳細例子可以參加上一次作業的要求。

這題和上週的題相比,不過是多了乙個新的引數:到達樓層,也就是上乙個問題的策略(遍歷乘客請求)中遍歷乘客請求的等待樓層的時候還要額外判斷乘客狀態並且重新遍歷乘客到達樓層,如此遍歷反而顯得不直觀而且還有重複計算增加時間複雜的風險(況且上乙個程式的全排列效率是真的低迷),所以還是犧牲了空間新增了乙個新的陣列來直接儲存需要停靠的樓層,這樣只需要遍歷陣列即可,結構也從全排列改為遞迴(10!的大小真的不敢想象)。

這麼改了之後效率果然上來了(最明顯的表現就是出現死迴圈的時候系統時間引數(測試輸出)一下就飆到了100w(一臉疲憊.jpg)),也算是實現了上乙個問題思考結尾留下的改進方法。

還有乙個檔案輸入輸出的要求,作為混跡多年的noip魚塘選手,不假思索的就打出來了。

#includeint main()

/*開啟型別:

"r":讀入

"w":寫入

*/

#includeint main()

但是總覺得沒有freopen靈活,所以我的程式暫時沒有用到c++的檔案流輸入輸出。

**名長度

bug數量

花費時間

b.cpp

159行

4個大約6h

先測試一些比較常規的資料

1、同時在相同樓層發出指令,前往同一樓層。

2、同時在相同樓層發出指令,前往不同樓層。

3、同時在不同的樓層發出指令,前往相同樓層。

4、同時在不同樓層發出指令,前往不同樓層。

四個「同時」的意義是把電梯看成會「未卜先知」,先確定電梯在基本層面沒有毛病(其實也挺複雜的)。

然後才是比較複雜的資料

1、會返回的資料

2、不能返回的資料

3、還有這個被我笑了很久的來自stolf的「複雜」資料

和@stolf和@seast互拍了答案之後,執行結果都基本一樣,應該是沒有太大的問題了。其實因為是爆搜演算法,所以只要能正常執行基本上就已經可靠了,這些資料更多的是用來排bug和讓人更加信服。

這一次的作業和上一次相比,只是略微的改動,是可以把上個問題的a.cpp拿來直接改的,但是由於不成熟的編碼規範和注釋習慣,使得修改**成為了本次作業的難題,甚至萌生了多次想要直接推掉重寫的衝動。今後寫的程式肯定要比這大的多,而重複修改肯定也是必不可少的,因此「因演算法競賽留下的惡習」形成的編碼規範必須要得到重視,今後要不斷的努力改正這個毛病。

不得不說github真是相當的有趣,以前就已經聽聞其鼎鼎大名,如今真正的註冊並使用後才知道**開源社群的奇妙。

而github**管理的基礎git更是奧妙重重,特別是規範使用git commit,是開源社群**版本規範管理的重點。第一次上手的時候並不知道commit資訊是可以刪除的,而當時寫的readme檔案又遇到了很奇怪的問題,於是出現了下面一副喜聞樂見的情況:

剛好自己近期開始接觸linux系統,終端的靈活使用顯得相當重要,而寒假的一系列作業和git剛好能鍛鍊我使用終端,一舉兩得,也算是幸運)。

寒假作業3

這個作業屬於哪個課程 2020物件導向程式設計張棟班 這個作業要求在 物件導向程式設計寒假作業3 這個作業的目標 1.繼續完成作業二的程式設計題。2.優化架構,思考 的拓展性,比如我需要增加其他功能,如選擇,迴圈語句怎麼辦。3.思考 可以參考現有的程式語言,把這些語言的內容加入。如選擇 迴圈語句 函...

13 14寒假作業3

poj 1050 輸入乙個矩陣,求出這個矩陣中數字之和最大的小矩陣的和是多少。開始沒有注意到資料量比較小,還以為是什麼神演算法。後來看到100 100的資料,於是暴力做過掉。列舉小矩陣的寬度,對長度進行dp求最子字串就可以了。區間和用字首和來記錄,敲起來還有點討厭 include include i...

寒假 作業2

大話物聯網 讀書心得 物聯網是繼計算機 網際網路與移動通訊之後的世界資訊產業的第三次浪潮。但是對於我這種連計算機都還不太懂的菜鳥新手和科技無知者來說,物聯網 三個字真的是乙個新興詞彙。在之前我連 物聯網 三個字好像都不太聽到過,更加不可能了解。殊不知我已經和這個世界如此的脫軌,已經被時代遠遠地落在了...