观察题目发现输出结果只有一行,可知可以整一个ans在每一个for循环里逐步加起来
同时题目里说分别给每一位学生推荐一所学校,细细思索一下便可知学校时可以重复的
那我们只要把每一个学生的分数在排好序的学校分数线里找就可以了
#include <bits/stdc++.h>
using namespace std;
//空间换时间,开一个足够大的数组用于存放学校的分数
int a[100010];
int main() {
int m, n;
//longlong开了一定能过 int看着数据范围估计要爆
long long ans = 0;
cin >> m >> n;
for (int i = 0; i < m; i++) {
scanf("%d", &a[i]);
}
sort(a, a + m);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
//找到第一个 大于 学生估计分数 的 学校分数线值
int *location = lower_bound(a, a + m, x);
//看看相邻两个哪一个相距更小
//事实上不建议使用这样多层括号堆叠的形式
if (location - a != 0) {
//*location - x是int减int
//location-1是指location前一个int地址,*(location-1)是就是前一个值了
//所以*(location - 1) - x还是int减int
ans += min( abs(*location - x), abs(*(location - 1) - x) );
} else{
//这种情况表示location就是第一个值,只能直接相减
ans += *location - x;
}
}
cout << ans;
return 0;
}