#23069: 小菜雞的簡單解法


waynebox01 (麻糬)

學校 : 國立高雄大學
編號 : 130336
來源 : [118.232.32.140]
最後登入時間 :
2022-09-11 03:16:25
b938. kevin 愛殺殺 | From: [218.35.40.37] | 發表日期 : 2020-10-20 19:49

事實上,本人對於 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優化的重點 哈哈

希望 能有一天看到 有緣人願意分享~~~

 
#25556: Re:小菜雞的簡單解法


vic20050418@gmail.com (Wen Vic)

學校 : 國立臺灣科技大學
編號 : 153262
來源 : [114.136.159.95]
最後登入時間 :
2023-07-29 13:10:41
b938. kevin 愛殺殺 | From: [114.136.159.185] | 發表日期 : 2021-06-01 10:26

I/O優化:

ios_base::sync_with_stdio(false);
cin.tie(0);
注意情況:
1.不能用endl做換行(使用/n),否則失效
2.標頭檔stdio和iostream不可共用(包含printf.scanf和cin.cout)

 

 

 
#25557: Re:小菜雞的簡單解法


vic20050418@gmail.com (Wen Vic)

學校 : 國立臺灣科技大學
編號 : 153262
來源 : [114.136.159.95]
最後登入時間 :
2023-07-29 13:10:41
b938. kevin 愛殺殺 | From: [114.136.159.185] | 發表日期 : 2021-06-01 10:27

參考文章 : https://hackmd.io/@wiwiho/CPN-io-optimization

文章都說得很清楚呦~

 
ZeroJudge Forum