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

 

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