#27164: Java 解題心得


r1cky (hehe)

學校 : 國立臺灣師範大學
編號 : 158637
來源 : [118.166.194.111]
最後登入時間 :
2024-04-13 22:10:59
g310. pD. 甜甜圈大對決(Donut) -- 110學年度hgsh校內賽 | From: [114.32.128.128] | 發表日期 : 2021-09-15 21:28

https://r1cky.pixnet.net/blog/post/47950804

 
#27167: Re:Java 解題心得


r1cky (hehe)

學校 : 國立臺灣師範大學
編號 : 158637
來源 : [118.166.194.111]
最後登入時間 :
2024-04-13 22:10:59
g310. pD. 甜甜圈大對決(Donut) -- 110學年度hgsh校內賽 | From: [49.216.50.223] | 發表日期 : 2021-09-16 07:07

https://r1cky.pixnet.net/blog/post/47950804

ㄨㄚˊ 加強測資後變TLE

 
#27239: Re:Java 解題心得


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

學校 : 國立臺中科技大學
編號 : 124762
來源 : [123.240.115.224]
最後登入時間 :
2022-08-27 13:56:53
g310. pD. 甜甜圈大對決(Donut) -- 110學年度hgsh校內賽 | From: [123.110.34.107] | 發表日期 : 2021-09-20 12:47

https://r1cky.pixnet.net/blog/post/47950804

ㄨㄚˊ 加強測資後變TLE

這題測資比較大 在讀取資料的時候 普通的 readLine().split(" ") 會不夠快

BufferedReader bur = new BufferedReader(new InputStreamReader(System.in));

int n = Integer.parseInt(bur.readLine());

String[] nums = bur.readLine().split(" ");

int[] arr = new int[n];

for(int i = 0; i < n; i++)

    arr[i] = Integer.parseInt(nums[i]);

nums = bur.readLine().split(" ")

這題如果這樣寫 1.5秒過了 測資都還沒讀完

 

可以換個方式

public static BufferedReader bur = new BufferedReader(new InputStreamReader(System.in));

public static int readInt()throws IOException{

    int n = 0, tmp = bur.read();

    while(tmp > 47 && tmp < 58){

        n *= 10;

        n += (tmp & 15);

        tmp = bur.read();

    }

    return n;

}

這樣讀取會快上取多 所占用的空間也比較小

這題我沒試過用StringTokenizer 不過估計速度會介於兩者之間

 

 

第三行的數值(N 個正整數 y) 不需要儲存起來 可以先宣告一個

int ans = 0; 

當作x陣列(第二行的 N 個正整數 x)的標記 如果讀取進來的數字大於x[ans] 就將 ans 加一  然後讀取下一個數字進行比較 

如果沒有大於x[ans] 就直接讀取下一個數字進行比較

當N個數字都讀取完之後 ans 即為答案

 
#27270: Re:Java 解題心得


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

學校 : 國立臺中科技大學
編號 : 124762
來源 : [123.240.115.224]
最後登入時間 :
2022-08-27 13:56:53
g310. pD. 甜甜圈大對決(Donut) -- 110學年度hgsh校內賽 | From: [123.110.34.107] | 發表日期 : 2021-09-21 12:39

 

時間和記憶體限制調整了,用BufferedReader的readLine()搭配split(" ")就可以AC了

 
 
#27356: Re:Java 解題心得


r1cky (hehe)

學校 : 國立臺灣師範大學
編號 : 158637
來源 : [118.166.194.111]
最後登入時間 :
2024-04-13 22:10:59
g310. pD. 甜甜圈大對決(Donut) -- 110學年度hgsh校內賽 | From: [49.216.27.187] | 發表日期 : 2021-09-27 07:41

https://r1cky.pixnet.net/blog/post/47950804

ㄨㄚˊ 加強測資後變TLE

這題測資比較大 在讀取資料的時候 普通的 readLine().split(" ") 會不夠快

BufferedReader bur = new BufferedReader(new InputStreamReader(System.in));

int n = Integer.parseInt(bur.readLine());

String[] nums = bur.readLine().split(" ");

int[] arr = new int[n];

for(int i = 0; i < n; i++)

    arr[i] = Integer.parseInt(nums[i]);

nums = bur.readLine().split(" ")

這題如果這樣寫 1.5秒過了 測資都還沒讀完

 

可以換個方式

public static BufferedReader bur = new BufferedReader(new InputStreamReader(System.in));

public static int readInt()throws IOException{

    int n = 0, tmp = bur.read();

    while(tmp > 47 && tmp < 58){

        n *= 10;

        n += (tmp & 15);

        tmp = bur.read();

    }

    return n;

}

這樣讀取會快上取多 所占用的空間也比較小

這題我沒試過用StringTokenizer 不過估計速度會介於兩者之間

 

 

第三行的數值(N 個正整數 y) 不需要儲存起來 可以先宣告一個

int ans = 0; 

當作x陣列(第二行的 N 個正整數 x)的標記 如果讀取進來的數字大於x[ans] 就將 ans 加一  然後讀取下一個數字進行比較 

如果沒有大於x[ans] 就直接讀取下一個數字進行比較

當N個數字都讀取完之後 ans 即為答案


感謝,學到了新知識,原來可以用類似讀取字元的方式讀這種測資,我那時以為BufferedReader的readLine跟split就夠快了。

 
#27442: Re:Java 解題心得


r1cky (hehe)

學校 : 國立臺灣師範大學
編號 : 158637
來源 : [118.166.194.111]
最後登入時間 :
2024-04-13 22:10:59
g310. pD. 甜甜圈大對決(Donut) -- 110學年度hgsh校內賽 | From: [210.71.78.245] | 發表日期 : 2021-10-06 14:53

https://r1cky.pixnet.net/blog/post/47950804

ㄨㄚˊ 加強測資後變TLE

這題測資比較大 在讀取資料的時候 普通的 readLine().split(" ") 會不夠快

BufferedReader bur = new BufferedReader(new InputStreamReader(System.in));

int n = Integer.parseInt(bur.readLine());

String[] nums = bur.readLine().split(" ");

int[] arr = new int[n];

for(int i = 0; i < n; i++)

    arr[i] = Integer.parseInt(nums[i]);

nums = bur.readLine().split(" ")

這題如果這樣寫 1.5秒過了 測資都還沒讀完

 

可以換個方式

public static BufferedReader bur = new BufferedReader(new InputStreamReader(System.in));

public static int readInt()throws IOException{

    int n = 0, tmp = bur.read();

    while(tmp > 47 && tmp < 58){

        n *= 10;

        n += (tmp & 15);

        tmp = bur.read();

    }

    return n;

}

這樣讀取會快上取多 所占用的空間也比較小

這題我沒試過用StringTokenizer 不過估計速度會介於兩者之間

 

 

第三行的數值(N 個正整數 y) 不需要儲存起來 可以先宣告一個

int ans = 0; 

當作x陣列(第二行的 N 個正整數 x)的標記 如果讀取進來的數字大於x[ans] 就將 ans 加一  然後讀取下一個數字進行比較 

如果沒有大於x[ans] 就直接讀取下一個數字進行比較

當N個數字都讀取完之後 ans 即為答案

現在AC了

 
ZeroJudge Forum