知识点回顾: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高一倍,这个差距可想而知,读取的数据越多,效果就越明显。
题目:
题目分析:题目本身并不存在难点,但是大家容易忽略判断和这两组。还要说的就是使用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