一、问题描述
二、问题分析
通过分治法解决(利用二分法的原理)
代码实现
#include<iostream>
#include<cmath>
#include<algorithm>//用于调用sort排序函数(默认升序)
using namespace std;
int f(int m, int n, int a[], int b[])
{
int sum = 0;
for (int i = 0; i < n; i++)//遍历n个学生
{
int left = 0;
int right = m - 1;
int minvalue = 751;
while (left <= right)//left=right 说明之剩下一个数 终结条件
{
int mid = (left + right) / 2;
int value = fabs(b[i] - a[mid]);
if (minvalue > value)
minvalue = value;
if (value == 0)
break;
else
{
if (b[i] > a[mid])
left = mid + 1;//继续在mid的右侧找寻
else
right = mid - 1;//继续在mid的左侧找寻
}
}
sum = sum + minvalue;
}
return sum;
}
int main()
{
int m, n;//m:学校数量 n:考生数量
cin >> m;
cin >> n;
int a[10];//存放学校分数
int b[10];//存放考生分数
for (int i = 0; i < m; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
cin >> b[i];
sort(a, a + m);//调用sort函数对a数组进行排序(默认升序)
int ans=f(m, n, a, b);
cout << ans;
return 0;
}