P1678 烦恼的高考志愿
二分
P1678
思路
二分先找到>=x的坐标i,然后取a[i]-x,a[i-1]-x的绝对值最小值
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m;
long long int ans;
int a[N], b[N];
int find(int x)
{
int l = 0, r = n - 1;
while (l < r)
{
int mid = l + r >> 1;
if (a[mid] >= x) r = mid;
else l = mid + 1;
}
return l;
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i ++ ) cin >> a[i];
for (int i = 0; i < m; i ++ ) cin >> b[i];
sort(a, a + n);
// sort(b, b + m);
// for (int i = 0; i < n; i ++ ) cout << a[i] << " "; cout << endl;
// for (int i = 0; i < m; i ++ ) cout << b[i] << " "; cout << endl;
for (int i = 0; i < m; i ++ )
{
// if (n == 1)
// {
// ans += abs(b[i] - a[0]);
// continue;
// }
if (b[i] <= a[0]) {
ans += a[0] - b[i];
continue;
}
if (b[i] >= a[n-1]) {
ans += b[i] - a[n-1];
continue;
}
int j = find(b[i]);
// if (j == n)// 所有的a < b[i]
// {
// ans += b[i] - a[n - 1];
// continue;
// }
// if (j == 0)// 所有的a >= b[i]
// {
// ans += a[0] - b[i];
// continue;
// }
// a[j]是第一个 >= b[i]的数
ans += min(a[j] - b[i], b[i] - a[j - 1]);
}
cout << ans << endl;
return 0;
}