1、题目背景
计算机竞赛小组的神牛V神终于结束了高考,然而作为班长的他还不能闲下来,班主任老t给了他一个艰巨的任务:帮同学找出最合理的大学填报方案。可是v神太忙了,身后还有一群小姑娘等着和他约会,于是他想到了同为计算机竞赛小组的你,请你帮他完成这个艰巨的任务。
2、输入格式
第一行读入两个整数m,n。m表示学校数,n表示学生数。第二行共有m个数,表示m个学校的预计录取分数。第三行有n个数,表示n个学生的估分成绩。
3、输出格式
4、输入输出样例
输入
4 3
513 598 567 689
500 600 550
输出
32
5、说明/提示
数据范围:
对于30%的数据,m,n<=1000,估分和录取线<=10000;
对于100%的数据,n,m<=100,000,录取线<=1000000。
6、思路
根据题意可知,只需要对每个学生的估计成绩,去预估录取分数线里面找到一个数,与他成绩的差的绝对值即可,然后不难发现,最后的结果和分数线的顺序无关,所以可以先把分数线进行一个排序,然后进行二分搜索,找到最小值,加到 sum 中。
注意每次sum都要清零。
#include <bits/stdc++.h>
#define N 100000
using namespace std;
int arr1[N+1];
int arr2[N+1];
int main(){
int m,n;
int ans = 0;
cin >> m >> n;
for(int i = 0;i < m;i++){
cin >> arr1[i];
}
for(int i = 0;i < n;i++){
cin >> arr2[i];
}
sort(arr1,arr1 + m);
// sort(arr2,arr2 + n);
for(int i = 0;i < n;i++){
int temp = arr2[i];
int _min = 10000;
int left = 0,right = m - 1;
while(left <= right){
int mid = (right + left) / 2;
if(arr1[mid] == temp){
_min = 0;
break;
}else if(arr1[mid] > temp){
_min = min(_min,abs(arr1[mid] - temp));
right = mid - 1;
}else{
_min = min(_min,abs(arr1[mid] - temp));
left = mid + 1;
}
}
ans += _min;
}
cout << ans << endl;
// system("pause");
return 0;
}