https://www.luogu.com.cn/problem/P1678
方法一:手写二分
方法二:STL
#include<bits/stdc++.h>
using namespace std;
int m, n, a[100005], b;
long long ans;
int min_ab(int x){ //求最小值为不满意度
int lb=lower_bound(a,a+m,x)-a; //求大于等于x的第一个数的下标
int t=lb-1==-1?0:(lb-1); //求之前的下标,避免数组越界
if(a[lb]==x)return 0; //如果相等返回0
else return min(abs(a[lb]-x), abs(a[t]-x)); //如果不相等返回相差小的那个值
}
int main()
{
cin>>m>>n;
for(int i=0; i<m; i++){
cin>>a[i];
}
sort(a, a+m);
for(int i=0; i<n; i++){
cin>>b;
ans+=min_ab(b);
}
cout<<ans;
return 0;
}
原文:https://www.cnblogs.com/tflsnoi/p/13204429.html