题单广场 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
先给学校分数线sort一下, 然后用二分法找到小于当前学生分数的最大学校分数线
如果学校分数线都大于学生分数,最后二分找到的 l(L的小写) 是最小的分数线,即a[0]
代码如下:
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const int N = 100010;
int a[N], b[N];
long long cnt = 0;
int main()
{
int n, m;
cin >> m >> n;
for (int i = 0; i < m; i++) cin >> a[i]; //学校
for (int i = 0; i < n; i++) cin >> b[i]; //学生
sort(a, a + m);
for (int i = 0; i < n; i++)
{
int l = 0;
int r = m - 1;
while (l < r)
{
int mid = l + r + 1>> 1; //后面有l=mid 为了不陷入死循环所以这里要加1
if (a[mid] < b[i]) l = mid;
else r = mid - 1;
}
if (l + 1 < m) cnt += min(abs(b[i] - a[l]), abs(a[l + 1] - b[i])); //注意l+1不能越界
else cnt += abs(b[i] - a[l]);
}
cout << cnt;
return 0;
}