解法:
对一组数据排序后两次二分,一次查大于等于的最小值,一次查小于等于的最大值,取两者最小值求不满意度。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
#define endl '\n'
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int m, n, cnt = 0;
cin >> m >> n;
vector<int> cai(m, 0), chi(n, 0);
for (int i = 0; i < m; i++) cin >> cai[i];
for (int i = 0; i < n; i++) cin >> chi[i];
sort(cai.begin(), cai.end());
for (int i = 0; i < n; i++) {
int l = upper_bound(cai.begin(), cai.end(), chi[i]) - cai.begin()-1;
int r = lower_bound(cai.begin(), cai.end(), chi[i]) - cai.begin();
if (l == -1) {
cnt += fabs(cai[0] - chi[i]);
}
else if (l == m - 1) {
cnt += fabs(cai[m - 1] - chi[i]);
}
//else if ( r == m) {
//cnt += fabs(cai[m - 1] - chi[i]);
//}
else {
cnt += min(fabs(cai[l] - chi[i]), fabs(cai[r] - chi[i]));
}
}
cout << cnt << endl;
return 0;
}