P1678 烦恼的高考志愿@蔡旭滚-你干嘛

烦恼的高考志愿

题目背景

计算机竞赛小组的神牛 V 神终于结束了高考,然而作为班长的他还不能闲下来,班主任老 t 给了他一个艰巨的任务:帮同学找出最合理的大学填报方案。可是 v 神太忙了,身后还有一群小姑娘等着和他约会,于是他想到了同为计算机竞赛小组的你,请你帮他完成这个艰巨的任务。

题目描述

现有 $m(m\le100000)$ 所学校,每所学校预计分数线是 $a_i(a_i\le10^6)$。有 $n(n\le100000)$ 位学生,估分分别为 $b_i(b_i\le10^6)$。

根据 $n$ 位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。求所有学生不满意度和的最小值。

输入格式

第一行读入两个整数 $m,n$。$m$ 表示学校数,$n$ 表示学生数。

第二行共有 $m$ 个数,表示 $m$ 个学校的预计录取分数。第三行有 $n$ 个数,表示 $n$ 个学生的估分成绩。

输出格式

输出一行,为最小的不满度之和。

样例 #1

样例输入 #1

4 3
513 598 567 689
500 600 550

样例输出 #1

32

提示

数据范围:

对于 $30%$ 的数据,$1\leq n,m\leq1000$,估分和录取线 $\leq10000$;

对于 $100%$ 的数据,$1\leq n,m\leq100000$,估分和录取线 $\leq 1000000$。


#include 
 
const int MAXM = 1e5+2;
int a[MAXM];//学校分数
const int MAXN = 1e5+2;
int b[MAXM];//学生分数
 
int main() {
    int n, m;
    scanf("%d%d", &m, &n);
 
    int i;
    //读入学校分数
    for (i=0; iscanf("%d", &a[i]);
    }
    //读入学生分数
    for (i=0; iscanf("%d", &b[i]);
    }
    
    std::sort(a, a+m);//排序
 
    //统计
    unsigned long long ans = 0;
    for (i=0; iint lo = std::lower_bound(a, a+m, b[i]) - a;
        int hi = std::upper_bound(a, a+m, b[i]) - a;
        if (lo==hi) {
            //b[i]没有在a[i]中,找最小的
            if (0==lo) {
                ans += (a[lo]-b[i]);
            } else if (hi>=m) {
                ans += (b[i]-a[hi-1]);
            } else {
                ans += std::min(b[i]-a[lo-1], a[hi]-b[i]);
            }
        }        
    }
    printf("%llu\n", ans);
 
    return 0;
}


#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+;
int a[maxn], b[maxn], n, m;
int l, r, mid, ans, sum;
 
int main(){
    cin>>n>>m;
    for(int i=;i<=n;++i)cin>>a[i];
    for(int i=;i<=m;++i)cin>>b[i];
    sort(a+, a+n+);
    //找到第一个比它大的
    for(int i=;i<=m;++i){
        l=; r=n;
        while(l<r){
            mid=(l+r)>>;
            if(a[mid]>=b[i]){r=mid;}        //将边界左移动
            else l=mid+;
        }
        if(b[i]<a[]){      //找不到第一个小于它的数
            sum+=a[]-b[i];
        }else{
        sum+=min(abs(a[l-]-b[i]), abs(a[l]-b[i]));     //比较第一个大于,最后一个小于的绝对值的大小,取小的
        }
    }
    cout<<sum<<endl;
}

通过请采纳