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;
}
posted @ 2025-08-01 14:53  Roin_Long  阅读(3)  评论(0)    收藏  举报