洛谷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);
	}
}

猜你喜欢

转载自blog.csdn.net/TXXERIN/article/details/107409650