PAT(B) 1060 爱丁顿数(Java:21分)
题目描述
英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” E ,即满足有 E 天骑车超过 E 英里的最大整数 E。据说爱丁顿自己的 E 等于87。
现给定某人 N 天的骑车距离,请你算出对应的爱丁顿数 E(≤N)。
输入格式
输入第一行给出一个正整数 N (≤105),即连续骑车的天数;第二行给出 N 个非负整数,代表每天的骑车距离。
输出格式
在一行中给出 N 天的爱丁顿数。
测试样例
Case 0:
10
6 7 6 9 3 10 8 2 7 8
6
Case 1:
10
12 13 14 15 16 17 18 19 20 21
10
Case 1:
10
0 0 0 0 0 0 0 0 0 0
0
分析💬
这道题目其实可以用二分查找做,但是我怎么写着写着,越来越复杂,把自己绕晕了。所以直接用循环遍历算了。当然这样肯定有一组数据是超时的。。
Java代码
/**********************************************************************************
Submit Time Status Score Problem Compiler Run Time User
8/26/2019, 21:37:54 PA 21 1060 Java (openjdk) 84 ms wowpH
Case 3: TLE
**********************************************************************************/
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
private static BufferedReader input; // 输入流
private static int numberOfDays; // 天数
private static int[] cyclingDistance; // 骑车距离
private static void initBufferedReader() { // 初始化输入流
InputStreamReader isr = new InputStreamReader(System.in);
input = new BufferedReader(isr);
}
private static void inputData() { // 输入数据
try {
numberOfDays = Integer.parseInt(input.readLine()); // 天数
String str = input.readLine();
String[] arr = str.split(" ");
cyclingDistance = new int[numberOfDays]; // 骑车距离
for (int i = 0; i < numberOfDays; ++i) {
cyclingDistance[i] = Integer.parseInt(arr[i]);
}
} catch (Exception e) {
}
}
private static int getEddington() { // 获取爱丁顿数
for (int i = 0; i < numberOfDays; ++i) {
if (numberOfDays - i < cyclingDistance[i]) {// 满足条件
return numberOfDays - i; // 返回爱丁顿数
}
}
return 0; // 无满足条件,则返回 0
}
public static void main(String[] args) {
initBufferedReader(); // 初始化输入流
inputData(); // 输入数据
Arrays.sort(cyclingDistance); // 升序排序
int e = getEddington(); // 获取爱丁顿数
System.out.println(e);
}
}