题目出处点这里
思路:二分。
注意:当学生分数大于等于学校最高录取分数线时,直接用学生分-学校分即可;
当学生分数小于等于学校最低录取分数线时,直接用学校分-学生分即可;
其余情况正常二分;
说实话有点不懂二分时的判断条件和返回值有什么需要讲究的地方,似乎不同条件返回的值都不一样,有时甚至可能会有索引超限,死循环的情况,不知道有没有看到这篇文章的大佬解释一下
代码:
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);
}
}