事實上,本人對於 link list 不太熟,而且也不太會使用 IO優化,但用以下的作法,基本上還是能達到 AC (0.4 s) 的程度,所以就簡單分享一下:
因應題意的要求,第一行輸入 n 及 m,簡單的直接呼叫 一組陣列 arr[] 及其大小為 n+1 ( 方便後續讀入資料時,不用再刻意計算 陣列索引值 的數值 )
然後 跑 for 迴圈,索引值從 1 ~ m-1 ,arr[i] 的值 等於 i+1 ( 意即 陣列紀錄的值 為 編號 i 的人後面站的人的編號數字 ),
最後一個 arr[m] 因為後面沒有站人,直接紀錄 -1,所以此時的 arr[i] 值,如下:
arr[0] = 未知,arr[1] = 2,arr[2] = 3,arr[3] = 4,arr[4] = 5 ... ,arr[m-2] = m-1,arr[m-1] = m,arr[m] = -1 。
接著總共輸入 m 個 int ,此時每輸入 一筆 int k,則直接對 arr[k] 進行判斷,
如果 arr[k] 等於 -1,則輸出 "0u0",否則,輸出 arr[k] 的值,並且將 arr[k] 的值變更為 原先 arr[k] 後面站的人的 後面站的人,且 arr[後面站的人] 變更為 -1
意即 將 被殺掉的人 ( 也就是 arr[k] ) 原先後面的人,繼承給了 arr[k] 之後,再將 arr[k] 變成 被殺掉的狀態 ( -1 )
然後 一直重複 直到 for 迴圈結束。
反正概念 大概就是這樣吧,至於 實現 我相信大家經驗應該都很豐富,我就不多說了。
後記:原本想說,這下好了,感覺判斷及計算部分很少,應該有辦法做到很快跑完程式,結果還是跑到了 0.4 秒 ......
想必 癥結點應該還是出在 IO優化 的部分了 ...... ,雖然很認真 google 過不少 IO優化 的文章,但感覺還是 抓不到 真正 IO優化的重點 哈哈
希望 能有一天看到 有緣人願意分享~~~
I/O優化:
注意情況:ios_base::sync_with_stdio(false);
cin.tie(0);
1.不能用endl做換行(使用/n),否則失效。
2.標頭檔stdio和iostream不可共用(包含printf.scanf和cin.cout)
參考文章 : https://hackmd.io/@wiwiho/CPN-io-optimization
文章都說得很清楚呦~