1、题目背景

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

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都要清零。

  1. #include <bits/stdc++.h>
  2. #define N 100000
  3. using namespace std;
  4. int arr1[N+1];
  5. int arr2[N+1];
  6. int main(){
  7. int m,n;
  8. int ans = 0;
  9. cin >> m >> n;
  10. for(int i = 0;i < m;i++){
  11. cin >> arr1[i];
  12. }
  13. for(int i = 0;i < n;i++){
  14. cin >> arr2[i];
  15. }
  16. sort(arr1,arr1 + m);
  17. // sort(arr2,arr2 + n);
  18. for(int i = 0;i < n;i++){
  19. int temp = arr2[i];
  20. int _min = 10000;
  21. int left = 0,right = m - 1;
  22. while(left <= right){
  23. int mid = (right + left) / 2;
  24. if(arr1[mid] == temp){
  25. _min = 0;
  26. break;
  27. }else if(arr1[mid] > temp){
  28. _min = min(_min,abs(arr1[mid] - temp));
  29. right = mid - 1;
  30. }else{
  31. _min = min(_min,abs(arr1[mid] - temp));
  32. left = mid + 1;
  33. }
  34. }
  35. ans += _min;
  36. }
  37. cout << ans << endl;
  38. // system("pause");
  39. return 0;
  40. }