洛谷P1678 Java

题目出处点这里
在这里插入图片描述思路:二分。
注意:当学生分数大于等于学校最高录取分数线时,直接用学生分-学校分即可;
当学生分数小于等于学校最低录取分数线时,直接用学校分-学生分即可;
其余情况正常二分;

说实话有点不懂二分时的判断条件和返回值有什么需要讲究的地方,似乎不同条件返回的值都不一样,有时甚至可能会有索引超限,死循环的情况,不知道有没有看到这篇文章的大佬解释一下

代码:

package binaryFindAndAnswer;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;

public class P1678 {

	static int n, m;
	static int a[] = new int[100001];
	static int b[] = new int[100001];

	public static int find(int x) {
		int l = 1, r = n;
		while (l <= r) {
			int mid = (l + r) / 2;
			if (a[mid] >= x)
				r = mid - 1;
			else
				l = mid + 1;
		}
		return r + 1;
	}

	public static void main(String[] args) throws IOException {
		StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		st.nextToken();
		n = (int) st.nval;
		st.nextToken();
		m = (int) st.nval;
		long sum = 0;
		for (int i = 1; i <= n; i++) {
			st.nextToken();
			a[i] = (int) st.nval;
		}
		for (int i = 1; i <= m; i++) {
			st.nextToken();
			b[i] = (int) st.nval;
		}
		Arrays.sort(a, 1, n + 1);
		for (int i = 1; i <= m; i++) {
			if (b[i] >= a[n])
				sum += b[i] - a[n];
			else if (a[1] >= b[i])
				sum += a[1] - b[i];
			else {
				int t = find(b[i]);
				int min = Math.min(Math.abs(a[t] - b[i]), Math.abs(a[t - 1] - b[i]));
				sum += min;
			}
		}
		System.out.println(sum);
	}
}

### 关于 P4552 的 Java 解决方案 对于 P4552 题目,该题目涉及较为复杂的逻辑运算以及特定的数据结构应用。虽然提供的参考资料中并未直接提及此题目的解决方案[^1],可以借鉴其他类似问题的解决思路来构建解答框架。 针对此类编程挑战,通常采用的方法包括但不限于: - **输入解析**:仔细分析输入格式,确保能够正确读取并理解所有必要的参数。 - **核心算法设计**:基于题目描述中的具体需求,选择合适的算法策略。例如动态规划、贪心算法或是图论相关方法等。 - **边界条件处理**:注意特殊情况下程序的行为,比如当输入为空或其他极端情形时应如何响应。 下面给出一段简化版的伪代码作为参考,用于说明可能的技术路线: ```java import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 假设这里完成对输入数据的初始化 solveProblem(); System.out.println(result); } private static void solveProblem() { // 实现具体的求解过程 result = ...; } } ``` 需要注意的是上述代码仅为示意用途,并未完全覆盖实际应用场景下的细节部分;真实环境中还需要进一步完善各个功能模块之间的交互逻辑。 为了更好地应对这类竞赛型编程任务,建议深入研究官方文档和其他高质量的学习资源,积累更多实战经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值