🧑🔧打铁人的执着👉👉👉 二分题解
💡 在这个博客中,我将和大家分享我在刷题过程中的经验和见解。
二分
🎈🎈🎈🎈🎈🎈
🧑🔧🧑🔧🧑🔧
传送门01 🎈🎈🎈👉 P1024 [NOIP2001 提高组 👈
题解:
import java.util.Scanner;
public class Main {
static double a;
static double b;
static double c;
static double d;
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
// 输入参数
a = cin.nextDouble();
b = cin.nextDouble();
c = cin.nextDouble();
d = cin.nextDouble();
// 遍历区间 [-10, 10)
for (double x = -10; x < 10; ++x) {
double f1 = fx(x);
double f2 = fx(x + 1);
if (f1 == 0) {
// 如果 f(x) = 0,则输出 x
System.out.printf("%.2f ", x);
} else if (f1 * f2 > 0) {
// 如果 f(x) 和 f(x+1) 同号,则继续遍历下一个点
continue;
} else if (f1 * f2 < 0){
// 如果 f(x) 和 f(x+1) 异号,则二分查找零点
double l = x, r = l + 1;
if (f1 < 0) {
// 如果 f(x) < 0,根据单调性,函数递增
while (r - l >= 1e-3) {
double mid = (l + r) / 2;
if (fx(mid) < 0) l = mid;
else r = mid;
}
} else {
// 如果 f(x) > 0,根据单调性,函数递减
while (r - l >= 1e-3) {
double mid = (l + r) / 2;
if (fx(mid) > 0) l = mid;
else r = mid;
}
}
// 输出 l,即 f(x) ≈ 0 的 x 值
System.out.printf("%.2f ", l);
}
}
}
public static double fx(double x) {
// 计算 f(x) 的值
return a * x * x * x + b * x * x + c * x + d;
}
}
🎈🎈🎈🎈🎈🎈
🧑🔧🧑🔧🧑🔧
P1168 中位数 🎈🎈🎈👉👈
题解:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 读取输入的系数个数
List<Integer> a = new ArrayList<>(); // 创建一个列表用于存储系数
for (int i = 1; i <= n; i++) {
int x = sc.nextInt(); // 读取输入的系数
binaryInsert(a, x); // 调用二分插入方法将系数插入到有序列表中
if (i % 2 == 1) {
System.out.println(a.get((i - 1) / 2)); // 如果插入的系数个数是奇数个,则输出列表中间位置的数值
}
}
}
private static void binaryInsert(List<Integer> a, int x) {
int left = 0;
int right = a.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (a.get(mid) < x) {
left = mid + 1; // 在右半部分继续查找
} else {
right = mid - 1; // 在左半部分继续查找
}
}
a.add(left, x); // 将系数插入到合适的位置,保持列表有序
}
}
🎈🎈🎈🎈🎈🐉
💭 结论
通过这个博客,我希望能够激发更多人对Java与算法的兴趣,也希望能够与更多有相同爱好的人交流和学习。
感谢你的阅读!🙏
成为荣誉的打铁怪吧🧑🔧🧑🔧🧑🔧