CCF 小明種蘋果(續)Java

知識點回顧:Scanner和BufferedReader

BufferedReader相對於Scanner來說要快一點,因爲Scanner對輸入數據進行正則解析,而BufferedReader只是簡單地讀取字符序列。在Java SE6中我們可知道一個非常方便的輸入數據的類Scanner,位於java.util包中,這個Scanner的具體用法爲

Scanner in = new Scanner(System.in);

。然而,Scanner讀取數據是按空格符,這其中包括空格鍵,Tab鍵,Enter鍵。只要遇到其中之一,Scanner的方法就會返回下一個輸入 ,這也就是我們會面臨的另一個問題,當我們的輸入數據中有空格時,我們就不會得到我們想要的數據,這樣我們就要考慮到BufferReader來讀取數據啦!BufferReader位於java.io包中,使用BufferReader就相對來說沒有那麼多方法來讓你選擇啦!讀取數據比較固定,這樣格式也就相對來說比較單一,只要記住就這一讀取數據的方法。

BufferReader br = new BufferReader(new InputStreamReader(System.in));

。BufferReader的效率要比Scanner高一倍,這個差距可想而知,讀取的數據越多,效果就越明顯。

題目:

題目分析:題目本身並不存在難點,但是大家容易忽略判斷A_{0},A_{N-1},A_{N-2}A_{0},A_{1},A_{N-1}這兩組。還要說的就是使用Scanner讀取數據時,顯示超時,使用BufferedReader讀取數據時耗時只有400ms,差異可想而知。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.io.IOException;

public class Main{

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String []line = br.readLine().split(" ");
		int N = Integer.parseInt(line[0]);
		boolean []flag = new boolean[N];
		Arrays.fill(flag, false);
		long T=0;
		int D=0,E=0;
		for(int i=0;i<N;i++) {
			line = br.readLine().split(" ");
			int M = Integer.parseInt(line[0]);
			int num = Integer.parseInt(line[1]); 
			for(int j=2;j<=M;j++) {
				int a = Integer.parseInt(line[j]);
				if(a<=0)
					num +=a;
				else {
					if(a<num) {
						num = a;
						flag[i] = true;
					}
				}
			}
			T += num;
			if(flag[i])
				D++;
		}
		//1,可知暴力方法,耗時最長
		for(int i=0;i<N-2;i++) {
			if(flag[i] && flag[i+1] && flag[i+2])
				E++;
		}
		if(flag[0]&&flag[1]&&flag[N-1])
			E++;
		if(flag[0]&&flag[N-2]&&flag[N-1])
			E++;
        //2,優化,當三者中有任一位false時,直接使i爲其index,即從它的下一個開始三元組判斷
		for(int i=0;i<N-2;i++) {
			if(flag[i] && flag[i+1] && flag[i+2])
				E++;
            if(flag[i+2]){
                i = i+2;
                continue;
            }
            if(flag[i+1]){
                i = i+1;
                continue;
            }
		}
		if(flag[0]&&flag[1]&&flag[N-1])
			E++;
		if(flag[0]&&flag[N-2]&&flag[N-1])
			E++;

        //3,以上方式均不是在同一個for循環中完成,略顯粗鄙。通過公式找到三元組的關係。但是也是暴力求解
		for(int i=0;i<N;i++) {
			if(flag[(i+N)%N] && flag[(i+1+N)%N] && flag[(i+N-1)%N])
				E++;
		}
		System.out.println(T+" "+D+ " "+E);
	}

}

//4
//4 74 -7 -12 -5
//5 73 -8 -6 59 -4
//5 76 -5 -10 60 -2
//5 80 -6 -15 59 0

//5
//4 10 0 9 0
//4 10 -2 7 0
//2 10 0
//4 10 -3 5 0
//4 10 -1 8 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章