题目描述
现有 m 所学校,每所学校预计分数线是 a [i]。有 n 位学生,估分分别为 b [i]。
根据 n 位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。求所有学生不满意度和的最小值。
输入格式
第一行读入两个整数 m,n。m 表示学校数,n 表示学生数。
第二行共有 m 个数,表示 m 个学校的预计录取分数。第三行有 n 个数,表示 n 个学生的估分成绩。
输出格式
输出一行,为最小的不满度之和。
分析:
就是一个普通的二分,通过二分找到学生i(分数为 b[i] )最适合的(差值最小)的学校。唯一的问题,就是在使用函数,例如sort、lower_bound之类的,一定要看清楚对那个数组使用,数组的范围!!!警钟敲烂!!!
提供俩种代码,本质是一样的:
1、把lower_bound函数写一遍
#include<iostream>
#include<algorithm>
#include<stdlib.h>
using namespace std;
int n, m;
int ln[100001];
long long sc, ans;
int find_minc(int s)
{
//找出差值最小的
int l = 0, r = m+1;
while (l < r) {
int mid = l + (r - l) / 2;
if (s >= ln[mid]) {
l = mid+1;//需要寻找到的是第一个大于sc的数
}
else {
r = mid;
}
}
if (s<=ln[1]) return ln[l] - s;
int cnt = min(abs(ln[l-1]-s), abs(s - ln[l]));
return cnt;
}
int main()
{
cin >> m >> n;
for (int i = 1; i <= m; i++) cin >> ln[i];
sort(ln + 1, ln + m + 1);
for (int i = 1; i <= n; i++) {
cin >> sc;
ans += find_minc(sc);
}
cout<<ans<<endl;
return 0;
}
2、利用C++的STL提供的lower_bound函数:
#include<iostream>
#include<algorithm>
#include<stdlib.h>
using namespace std;
int n, m;
int ln[100001];
long long sc, ans;
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++) cin>>ln[i];
sort(ln+1,ln+m+1);
for(int i=1;i<=n;i++){
cin>>sc;
int pos=lower_bound(ln+1,ln+1+m,sc)-ln;
//找出第一个>=sc的元素的位置
//注意“-ln”
//if(pos==n+1)
if(pos==1){
ans+=(ln[pos]-sc);
}
else{
ans+=min(abs(sc-ln[pos]),abs(sc-ln[pos-1]));
}
}
cout<<ans<<endl;
return 0;
}
本人就是在sort和lower_bound函数那里犯了两次同样的错。