嗯...一個看着簡單越寫越想撞牆的題...20分棄坑...這裏寫的只是做題時候的思路,歡迎指正。
===========================原題==========================
該機器有兩個 CPU 和一個 GPU。對於每個任務,你可以爲它分配不 同的硬件資源:
1. 在單個 CPU 上運行。
2. 在兩個 CPU 上同時運行。
3. 在單個 CPU 和 GPU 上同時運行。
4. 在兩個 CPU 和 GPU 上同時運行。
一個任務開始執行以後,將會獨佔它所用到的所有硬件資源,不得中 斷,直到執行結束爲止。第 i 個任務用單個 CPU,兩個 CPU,單個 CPU 加 GPU,兩個 CPU 加 GPU 運行所消耗的時間分別爲 ai,bi,ci 和 di。
現在需要你計算出至少需要花多少時間可以把所有給定的任務完成。
接下來的 n 行每行有四個正整數 ai, bi, ci, di(ai, bi, ci, di 均不超過 10), 以空格隔開。
4 4 2 2
7 4 7 4
3 3 3 3
同時運行第一個任務(單 CPU 加上 GPU)和第三個任務(單 CPU), 它們分別在時刻 2 和時刻 3 完成。在時刻 3 開始雙 CPU 運行任務 2,在 時刻 7 完成。
===========================思路==========================
首先讀完題發現的第一點:
【加上GPU未必會加快速度,雙CPU也不見得會顯著提高效率。】
其次想到的就是雙CPU時是否使用GPU完全沒關係...畢竟兩個CPU都是你的了...
爲了方便我們約定一下符號縮寫:
1 單CPU處理SCSingle CPU
2 雙CPU處理DCDouble CPU
3 單CPU帶GPUSCGSingle CPU and GPU
4 雙CPU帶GPUDCGDouble CPU and GPU
5 不做任何處理PASS
關於每一時刻可能有的狀態及決策:
1、單CPU空閒,GPU佔用:①SC②PASS
2、單CPU空閒,GPU空閒 :①SC②SCG③PASS
3、雙CPU空閒:①SCG+SC②SC+SCG③SC+SC④DC(G)
4、雙CPU佔用:①PASS
關於SCG+SC ≠ SC+SCG 的情況舉個例子就是
假如按某個規則取出的兩個任務:
SCSCG
A108 SC(A)+SCG(B) = 11
B41 SCG(A)+SC(B) = 12
雖然和去出任務的條件有關,但...缺的就是很好的取出條件
第一次...決定用模擬+貪心
然後就是痛苦的掙扎= =、到底該如何決策雙CPU空閒的時候用SC(G)+SC還是DC???
剛開始把DC情況分成了以下兩種:
很明顯只有在max(SC1, SC2) < DC1 + DC2 的時候應該使用DC,但考慮到後來的任務SC填補上缺口之後結果可能會出現變化,所以只有在當前判定的集合是餘下全集的時候比較好用。
後來按照(2 * DC > SCG)的標準嘗試判定了一下發現也可以舉出特別多反例,於是放棄。
模擬思路的最後掙扎是根據分類排了一個優先順序:
① DC集:按SCG與DC差值降序排列
② SCG集:按SC與SCG差值降序排列
③ SC集:按SC值升序排列
想起來之前的最小代價歸併問題,想要打個flag之後從三個集合裏按順序取符合條件的,勤勤懇懇寫了一大圈最後竟然寫成了一個剪枝的思路,判別DC的方法還是沒找到。(期間也嘗試了最後一個任務再判斷是否DC,跑得更遠)
之後就是第二個坑:深搜+剪枝,主要思路就是嘗試了上面所有可能...
剪枝的地方: ① 時間已到達目前最小完成時間 - 返回
② 給定任務嘗試順序
③ 設定工作上限
④ 判斷是否等待以嘗試DC情況
⑤ 合併 SCG與SC混合情況(對比,不再分叉)
⑥ 有限度的嘗試SC+SC情況
⑦ 兩個CPU同時工作時直接跳轉
... ...
寫題用的時間太長,改到最後代碼都亂了,超時的問題倒是解決了,又不知道哪裏出錯了。可能本來的思路就有漏洞或者直接跑歪了,找遍全世界也沒個答案(連官方都沒標程醉了...)。剪枝肯定還有能剪的地方,目前來看貪心也貪的不夠,代碼就不貼了,有大神路過跪求AC代碼...