推 Yshuan:我不太懂妳的演算法如何保證使用個數最小 01/26 23:31
→ Yshuan:} greedy的做法吧 01/26 23:38
→ tom1990:對應該也要比較 segment 長度,我是想在符合 left pointer 01/27 00:24
→ tom1990:裡面所有人去掃找出可以到最遠的 right pointer 01/27 00:24
這裡統整一下,這問題似乎是 最小含蓋 的基礎題,
解法大致上樓上都點出來了,點進去看後發現測資還蠻特別的,
再提幾個細節部份
1. 題目一開始就會給你 M 值,要包的範圍是 [0,M],測資是給 [Li,Ri]
測資應有三種可以直接跳過不用讀進去
(a) Li == Ri --> 沒有貢獻度
(b) Ri <=0 --> 沒有貢獻度
(c) Li >= M --> 沒有貢獻度
另外在掃的時候可以順便判斷下面這個
(a) 你掃過的資料沒有一個數字 >= M,這一定是無解。
2. 再來是 t 大說的,對 Li 做升冪排序, 至於 Ri 要不要排, 我是覺得可以不用排
不知其他版友怎麼看 (排序速度可能是關鍵,因測資到10萬筆)
3. 假設挑出來測資排序後出來如下
[0,1] [0,3] [0,5] [0,10]
[1,5] [1,6] [1,7] [1,10]
[2,10]
首先先確認一件事,
排下來的結果如果 "第一個區間" 的 Li > 0
那就直接跳出來,無解了。
接著的確是 Y 大說的貪婪法, 同一個 Li 直接挑最後一筆出來即可,
但這裡必須再考慮 L1!=L2, R1=R2 的情況,以上面的情形,是只要挑 [0,10] 即可
就完全不用再考慮 [1,10] [2,10] 問題,
我的想法是把 [0,10] 挑出來後,可以去找 Ri=10 的部份,那筆資料可以直接砍掉
( 您的方法似乎就是這部份會出問題 )
一個技巧是,多設一個變數 CurrentR, 紀錄目前最右邊是記到哪裡,
if (Ri <= CurrentR) , 可以跳過不用理它了。
--------------------
這題大概就這樣, 有高手想補充的話非常樂意,
此外還有其它的進階題
http://ds.fzu.edu.cn/fine/resources/download/bicov.pdf
有興趣的話再解解看
最後的PS: 小聲的說,這個我覺得到 Prob_Solve 問比較適合
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.142
※ 編輯: tropical72 來自: 180.177.76.142 (01/27 05:57)
推 suhorng:你連結的這題跟原PO的題目重點不同... 01/27 12:13
→ suhorng:而且連結中的應該是二分圖才對...? 01/27 12:14
→ suhorng:這兩個問題好像完全不一樣耶... 01/27 12:27
推 tom1990:謝謝你~ 我看forum上面測資有夾雜int和double所以想說用 01/27 12:57
→ tom1990:sscanf來解決 01/27 12:57
推 tom1990:測資只會有int... 01/27 13:05
→ tropical72:嗯,只是在我看來那連結也是最小含蓋問題 XD 01/27 17:24
推 suhorng:嗯@@ 我覺得二分圖最小點覆蓋 跟這題的線段覆蓋不同 01/27 17:50
→ suhorng:模型也無法轉過去的樣子 01/27 17:50