8.2暑期第八节课上午总结

最后更新于 2025-08-02 21:45:15
作者
分类 个人记录

P1678 烦恼的高考志愿

解题思路

这道题主要是使用二分写,首先输入一个a数组,然后排序,运用二分查找,再累加

在查找时,我们应把左右两端点都枚举一遍

注意事项

1、需从小到大排序

2、使用二分时,要把左端点设为无穷小(如-1e9),右端点设为无穷大(如1e9),这样程序才不会出错

3、累计结果时,注意最小的与分数线相差的分数的正负

代码

#include<bits/stdc++.h>
using namespace std;
long long a[100005];
int main(){
    long long n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    a[0]=INT_MIN;
    a[n+1]=INT_MAX;
    long long ans=0;
    for(int i=1;i<=m;i++){
        long long x;
        cin>>x;
        long long l=0,r=n+1;
        while(l+1<r){
            long long mid=(l+r)/2;
            if(a[mid]<x) l=mid;
            else r=mid;
        }
        ans+=min(abs(a[r]-x),abs(a[l]-x));
    }
    cout<<ans;
    return 0;
}