poj 1033 Defragment 解題報告

2021-04-25 08:10:42 字數 1095 閱讀 8285

距離從1000處子題,已經過了好些日子了,終於突破20題了,但是還沒有進入前1w(中國的人真多啊),一直在做動態規劃的題,實在是被動態規劃的強大折服。最近開始找些搜尋的題來做,剪那個sticks,一直剪不過tle,於是決定換道題,看網上的推薦說這是一道搜尋題,於是開始切!~~~

題意:磁碟整理,按照從第乙個檔案到最後乙個檔案的順序排放,而且每個檔案的碎片按原來的順序放在一起,要求轉移的次數最少。

解:其實根本不用搜尋,一開始想搜尋想了很久,上網找解題報告也沒找到(這麼水的一題竟然沒有解題報告),於是開始自已想。

其實碎片的排列只有二種情況:

1. a0碎片沒有放在原來的位置,而它原來的位置正好是空的。而a1碎片也剛好沒有放在原來的位置,而b原來的位置之前一直被a0占領,同樣還有a2碎片沒有在原來位置,而其原來的位置之前一直被a1占領,以此遞推直到ai,沒有碎片要放在ai的位置為止。這種情況稱為鏈。

2. 基本上同1一樣,不過,一開始的時候a0的原來位置並不是空的,而是最後的那個ai占領著,這種情況稱為環。

解決方法:

1。對於1,只需要從a0開始乙個乙個按順序放到原來的位置上即可。

2。對於2,只需要從環中的任何乙個節點開始,先將這個節點放到從尾部開始數起的空位,然後以鏈的方式處理,最後再將這個節點的數放回到最後乙個節點的位置。

主要資料結構:

q[i]:放在第i個位上的數應該放在第q[i]個位上。

d[i]:應該放在第i個位上的數,現在放在了第d[i]個位上。

ps:這是本人除了1000之外第一次一擊即ac的題,特上來發一篇解題報告慶祝!~

附ac **:

#include

using namespace std;

int n,k,tmp,t,index,pi;

int q[10000];

int d[10000];

bool optneed;

int main()

printf("%d %d/n",tmp+1,index+1);

q[index]=q[tmp];q[tmp]=-1;

}}else printf("no optimization needed/n");

return 0;

}

poj1007 DNA Sorting解題報告

題目要求的是一條dna序列的逆序數,求逆序數可以考慮使用歸併演算法來進行求解。我們來設想這樣乙個場景 相鄰的a b兩塊進行公升序排序,各自都已經是排好序的了,且b排在a右邊。那麼當把b中的某數t放到已排序的數列中,那麼a序列中剩下的數就是比數t要大的,但我們要注意到 在原序列中,由於b序列在a序列右...

poj 1007DNA Sorting解題報告

默默的說真的是水題 題目大意 序列 未排序程度 的乙個計算方式是元素亂序的元素對個數。例如 在單詞序列 daabec 中,因為d大於右邊四個單詞,e大於c,所以計算結果為5。這種計算方法稱為序列的逆序數。序列 aacedgg 逆序數為1 e與d 近似排序,而序列 zwqm 逆序數為6 它是已排序序列...

POJ 1733 Parity game 解題報告

現在有乙個n長度的字串,這個字串,由0,1兩個字元組成。現在m行,每行給你兩個數x和y,再給乙個字串,even或者odd,表示 x,y 區間內1的個數是even或者odd。現在前k行是正確的,第k 1行是錯誤的,你要做的就是輸出這個k值。和前一道題很像。注意需要離散化。這裡的離散化是不需要考慮相對大...