题目链接:https://www.luogu.com.cn/problem/P1678
这道题最快的方法是使用lower_bound()函数,该函数用法:
position = lower_bound(array,array+length,number)-array;
由于lower_bound()函数返回的是内存中的地址,所以减去数组的地址就是第一个大于等于number的数的下标。当数组内所有数比number小时,返回length。
#include <bits/stdc++.h>
#define MAXN 100050
#define ll long long
ll m,n;
ll stu[MAXN],sch[MAXN];
using namespace std;
int main()
{
cin>>m>>n;
ll i,ans=0;
int p;
for(i=0; i<m; i++)
{
cin>>sch[i];
}
for(i=0; i<n; i++)
{
cin>>stu[i];
}
sort(sch,sch+m);
for(i=0; i<n; i++)
{
p = lower_bound(sch,sch+m,stu[i])-sch;
if(p==m) //如果所有的学校分数都小于考生分数
{
ans += stu[i] - sch[m-1];
}else if(p==0)
{
ans += sch[p] - stu[i];
}else
{
ans += min(abs(sch[p]-stu[i]),abs(stu[i]-sch[p-1]));
//由于不确定sch[p]和sch[p-1]哪一个更接近于stu[i]
}
}
cout<<ans<<endl;
return 0;
}