链接
https://www.luogu.org/problemnew/show/P1678
大意
给定一些学生和学校,让学生与学校匹配(可以有多名学生匹配同一所学校
)使得所有被匹配的学校的分数线与考生的成绩差之和最小
即
Ans=min{∑i=1mA[i]−B[i]}
A
n
s
=
m
i
n
{
∑
i
=
1
m
A
[
i
]
−
B
[
i
]
}
思路
先将学校分数线排序
用二分找到学校分数线与考生成绩最接近的那个学校,然后求和即可
代码
#include<cstdio>
#include<algorithm>
using namespace std;int a[100001],b,n,m,ans,t;
inline int binary(register int l,register int r,register int x)//二分查找
{
while(l<=r)
{
int mid=(l+r)>>1;
if(a[mid]<x) l=mid+1;
else r=mid-1;
}
return l;
}
signed main()
{
scanf("%d%d",&n,&m);
for(register int i=1;i<=n;i++) scanf("%d",a+i);
sort(a+1,a+1+n);
for(register int i=1;i<=m;i++)
{
scanf("%d",&b);
t=binary(1,n,b);//查找匹配
if(b<=a[1])ans+=a[1]-b;//特判
else ans+=min(abs(a[~-t]-b),abs(a[t]-b));//这两所学校的分数线是最接近的,求最小值即可
}
printf("%d",ans);//输出
}