计算机竞赛小组的神牛 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$ 个学生的估分成绩。
输出一行,为最小的不满度之和。
4 3
513 598 567 689
500 600 550
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;
}