参考
【算法1-6】二分查找与二分答案 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

- P2249 【深基13.例1】查找
- P1102 A-B 数对
- P1873 [COCI 2011/2012 #5] EKO / 砍树
- P1024 [NOIP2001 提高组] 一元三次方程求解
- P1678 烦恼的高考志愿
- P2440 木材加工
- P2678 [NOIP2015 提高组] 跳石头
- P3853 [TJOI2007] 路标设置
- P1182 数列分段 Section II
- P1163 银行贷款
- P3743 kotori的设备
模板
感谢锋哥给我的模板,不用再被边界和while条件以及最后到底取哪个值发愁了;
- 添加一个
ans变量,l和r初始化为有值的边界下标,while条件为l<=r,最后取得的结果就是ans。 - 针对题目问题做判断,对于符合条件的要给ans赋值。
- 例如升序求第一个大于k的那就继续往左找(你想,找到了一个符合这个条件的,但是因为升序,则左边可能还有大于k的),此时
r=mid-1。
详细代码可见二分查找专题代码.pdf
题目
P2249 【深基13.例1】查找
几个MLE?
package _1_6;
import java.util.Scanner;
public class P2249 {
private static int n;
private static int m;
private static int[] nums;
private static int[] ks;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
nums = new int[n + 1];
ks = new int[m];
for (int i = 1; i <= n; i++) {
nums[i] = scanner.nextInt();
}
for (int i = 0; i < m; i++) {
ks[i] = scanner.nextInt();
}
for (int i = 0; i < m; i++) {
int res = biSearch(ks[i]);
System.out.printf("%d ", res);
}
scanner.close();
}
public static int biSearch(int k) {
int l = 1, r = n;
int ans = -1;
while (l <= r) {
int m = l + (r - l) / 2;
if (nums[m] == k) {
ans = m;
r = m - 1;
} else if (nums[m] < k) {
l = m + 1;
} else {
r = m - 1;
}
}
return ans;
}
}
修改后:使用快速输入输出(别用Scanner和sout了!!!都给我用StreamTokenizer和PrintWriter)看看这前后差距
java快速输入输出 - Kitorio - 博客园 (cnblogs.com)


package _1_6;
import java.io.*;
public class P2249 {
private static int n;
private static int m;
private static int[] nums;
private static int[] ks;
public static void main(String[] args) throws IOException {
// algo 快速输入:StreamTokenizer
StreamTokenizer streamTokenizer = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
// 注意读之前要nextToken,可以写一个fun
streamTokenizer.nextToken();
n = (int) streamTokenizer.nval;
streamTokenizer.nextToken();
m = (int) streamTokenizer.nval;
nums = new int[n + 1];
ks = new int[m];
for (int i = 1; i <= n; i

本文介绍了如何在Java中优化二分查找算法,包括使用StreamTokenizer和PrintWriter进行快速输入输出,以及在P1102A-B和P1873等具体题目中的应用实例。还提及了一元三次方程求解和高精度计算的方法。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



