大雨过后,一些高低不平的地方就会形成积水,俗称为"坑"。这里我们将问题简化为只考虑一段路面的横截面。我们将这一段截面上的土地分割成单位宽度的窄条,测量出每个窄条的高度。假设有无穷多的水量从天而降,请你计算一下,这段路面上会形成多少个水坑?坑的最大深度是多少毫米?
顺便祝大家新年少踩坑!
输入格式:
输入第一行给出一个正整数 N(≤105)。随后一行给出 N 个非负整数,为路面横截面总左到右的单位宽度窄条的高度,以毫米为单位,不超过 1000。
输出格式:
输出分两行,第一行输出水坑的个数,第二行输出所有水坑中最大的深度,以毫米为单位。
注意:即使两个相邻的水坑有相同高度的水平面,只要之间有窄条相隔,就算是两个水坑。
输入样例:
12
1 4 2 10 7 1 2 1 8 3 1 2
输出样例:
3
7
样例说明:
下图给出了样例中得到的水坑示意图。

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
InputStream in = System.in;
int n = readInt(in);
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = readInt(in);
}
int[] leftmax = new int[n];
leftmax[0] = arr[0];
for (int i = 1; i <n ; i++) {
leftmax[i] = Math.max(leftmax[i - 1] , arr[i]);
}
int[] rigmax = new int[n];
rigmax[n - 1] = arr[n - 1];
for (int i = n - 2; i >= 0 ; i--) {
rigmax[i] = Math.max(rigmax[i + 1] , arr[i]);
}
int dep = 0;
int con = 0;
for (int i = 1; i < n - 1 ; i++) {
int tmp = Math.min(leftmax[i] , rigmax[i]) - arr[i];
dep = Math.max(dep , tmp);
if(Math.min(leftmax[i - 1] , rigmax[i - 1]) - arr[i - 1] == 0 && Math.min(leftmax[i] , rigmax[i]) - arr[i] != 0)
con++;
}
System.out.println(con);
System.out.println(dep);
}
static int readInt(InputStream in) throws IOException{
int c = 0;
int x = 0;
while((c = in.read()) < '0')
;
do {
x = x * 10 + c - '0';
}
while ((c = in.read()) >= '0');
return x;
}
}
readInt 比 BufferedReader 快的本质是:它砍掉了所有 "无用的封装",只做 "读数字" 这一件事,而 BufferedReader 是通用型工具,自带大量冗余逻辑。
为什么快?
少了「字符串解析」的额外开销
BufferedReader 读取数字的常规写法是:
java
运行
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine(); // 先读成字符串
int num = Integer.parseInt(line); // 再转成整数
- 第一步:把字节流 → 字符串(要处理编码、拼接字符);
- 第二步:把字符串 → 整数(要校验格式、逐字符转数字)。
而你的 readInt 是:
java
运行
// 直接从字节流 → 整数,跳过"字符串"中间层
do {
x = x * 10 + c - '0'; // 字节直接转数字,一步到位
} while ((c = in.read()) >= '0');
✅ 少了「字符串创建 + 解析」,这是最大的提速点!