题目:
根据n位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。求所有学生不满意度和的最小值。读入数据有三行,第一行读入两个整数m,n。m表示学校数,n表示学生数。第二行共有m个数,表示m个学校的预计录取分数。第三行有n个数,表示n个学生的估分成绩。输出数据有一行,为最小的不满度之和。
解题思路:
Sort+二分
设l为0,r为n+1,如果x(学校的预计录取分数)[mid]≤y(自然就是学生分数了),我们就把边界往大的一边缩,反之往小的一边缩,然后取min,特判看下面
Accepted code:
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,x[100001],y;
int zl(int x) {return x>0?x:-x;}//abs
int min(int x,int y){return x>y?y:x;}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&x[i]);
sort(x+1,x+n+1);
int ans=0;
for (int i=1;i<=m;i++)
{
scanf("%d",&y);
int l=0,r=n+1;
while(l<r)
{
int mid=(l+r)>>1;
if (x[mid]<=y) l=mid+1; else r=mid;
}
if (y<=x[1])//这个特判不加会WA
ans+=x[1]-y;
else
ans+=min(zl(x[l-1]-y),zl(x[l]-y));
}
printf("%d",ans);
return 0;
}