知識點回顧: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