01.题目及链接
题目链接:https://www.luogu.com.cn/problem/P1678
02.解题思路
- 使用HashSet对学校分数进行去重
- 对学校分数从小到大排序
- 二分查找查找>=student的第一个元素的下标l,则可能存在第一个一个元素<student的元素下标为(l-1)
- 该学生的最小不满意度为:min(sudent-schools[l-1], schools[l]-sudent);
03.具体代码
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int m=in.nextInt(),n=in.nextInt();
Set<Integer> set=new HashSet<>();
//学校分数去重
for (int i = 1; i <= m; i++) {
set.add(in.nextInt());
}
int[] schools=new int[set.size()+2];
int index=1;
for(Integer i:set) {
schools[index]=i;
index++;
}
schools[0]=-10000000;schools[set.size()+1]=10000000;//注意设置边界值
Arrays.sort(schools);
long score=0;
for (int i = 0; i < n; i++) {
int l=0,r=schools.length,sudent=in.nextInt();
//查找>=student的第一个元素的下标l
while (l<r) {
int mid=(l+r)>>1;
if(schools[mid]>=sudent) r=mid;
else l=mid+1;
}
score+=Math.min(sudent-schools[l-1], schools[l]-sudent);
}
System.out.println(score);
}
}
04.补充:二分常用套路详解
https://blog.csdn.net/qq_46237746/article/details/123813308