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 100000using 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;}
