#24589: JAVA 避免MLE


jam930725@gmail.com (浮沉沉沉沉沉沉沉沉)

學校 : 國立臺中科技大學
編號 : 124762
來源 : [123.240.115.224]
最後登入時間 :
2022-08-27 13:56:53
f163. 貨物分配 -- 2020年1月APCS | From: [89.42.31.93] | 發表日期 : 2021-03-07 22:04

 

JAVA在寫這題時 不要直接用class建立Node類別 會有很高的機率MLE (個人極限是98% 測資點#48會MLE)

(大概像這樣)

public static class Node{

    int parent = -1;

    int left = -1;

    int right = -1;

    int w = 0;

    public Node(int n){

        w = n;

    }

}

因為JAVA在計算空間時,空的物件占用大小就算8byte,儲存引用還要4byte,再算入使用的4個int = 8+4+4*4 = 28byte (其實是32byte 會取8的整數倍,所以會有填充的4byte)

平常在解題目時其實還好 畢竟比較方便 但這題最大的一筆測資 n > 900000,節點數量>1800000,再加上IO以及儲存第3行m個int所需的空間,很容易MLE (記憶體限制64MB)

比起直接用4個長度為n*2的int陣列 多用了近2倍的空間

另外題目的葉結點其實就是貨櫃 因此儲存左節點和右節點的陣列的長度 只需要n即可 可進一步縮減空間

 

如果遇到TLE 可以使用BufferedReader(搭配split()或是StringTokenizer)/BufferedWriter進行輸入/輸出,時間可以壓到1s內

 
ZeroJudge Forum