烦恼的高考志愿

题目:

根据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;
}

猜你喜欢

转载自blog.csdn.net/qq_39798042/article/details/81635751