[問題] Uva 10020 AC

看板C_and_CPP (C/C++)作者 (湯姆祥)時間15年前 (2011/01/26 22:51), 編輯推噓2(2011)
留言13則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): Wrong answer 餵入的資料(Input): sample 和 forum 測資都正確 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) http://paste.plurk.com/show/358421/ 補充說明(Supplement): 題目:http://acm.uva.es/problemset/v100/10020.html 大意: 給一個 range[0, M],有 n(n < 100001) 個 segment[L, R],問最少用幾 個 segment 可以 cover 這個 range,如果沒有辦法 ouput 0,如果可以 output segment 個數和所用的 segment(sorted L) 解法: 先對 segment 的 L 排序,去除 segment 在 [0, M] 之外,記錄一個 left 表示目前的 range [left, M] 和一個 right 表示目前可以到的最右邊範圍 ,掃一次 sorted array 如果 segment 符合 L <= left && R > left ,segment 的 R update right,再用 right update left並儲存所得 segment,如果最後 left >= M 表示可以 cover。 中間有處理 segment 是浮點數的問題。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.167.137.126

01/26 23:31, , 1F
我不太懂妳的演算法如何保證使用個數最小
01/26 23:31, 1F

01/26 23:32, , 2F
我的話cmp會多個條件 if both head are equal, cmp tail
01/26 23:32, 2F

01/26 23:35, , 3F
for(i=now=0;now<n(seg);) {
01/26 23:35, 3F

01/26 23:35, , 4F
while(seg[i].head<now)++i;
01/26 23:35, 4F

01/26 23:36, , 5F
choos seg[i] as a answer; now = seg[i].tail + 1;
01/26 23:36, 5F

01/26 23:37, , 6F
if( now > m) break; // find all answer
01/26 23:37, 6F

01/26 23:38, , 7F
} greedy的做法吧
01/26 23:38, 7F

01/27 00:24, , 8F
對應該也要比較 segment 長度,我是想在符合 left pointer
01/27 00:24, 8F

01/27 00:24, , 9F
裡面所有人去掃找出可以到最遠的 right pointer
01/27 00:24, 9F

01/27 00:26, , 10F
找到的答案應該是在 optimal solution 裡面且變成子問題
01/27 00:26, 10F

01/27 11:13, , 11F
做法看起來對
01/27 11:13, 11F

01/27 11:22, , 12F
可能是浮點數誤差,試試看純用int ...
01/27 11:22, 12F

01/27 11:31, , 13F
感覺你對這個做法的實做有點奇怪...
01/27 11:31, 13F
文章代碼(AID): #1DG3Jp2N (C_and_CPP)
文章代碼(AID): #1DG3Jp2N (C_and_CPP)