#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
vector<int> school; //用一个存放学校分数线的容器
//二分查找找第一个小于和大于自己的值,比较差值
int getTheBestValue (vector<int>& arr, int target) {
int left=0, right=arr.size()-1;
//513 567 598 689 => 600
if (arr[left]>=target) {
return abs(arr[left]-target);
}
else if (arr[right]<=target) {
return abs(arr[right]-target);
}
while (left+1<right) {
int mid=(right-left)/2+left;
if (arr[mid]<target) {
left=mid;
}
else if (arr[mid]>target) {
right=mid;
}
else {
return 0;
}
}
return min(abs(arr[left]-target), abs(arr[right]-target));
}
int main () {
int n,m; //m表示学校数 n表示学生数
long long sum=0;
cin>>m>>n;
int student[n];
for (int i=0;i<m;i++) {
int num;
cin>>num;
school.push_back(num); //把数据放进容器里
}
sort(school.begin(),school.end()); //对容器进行排序,无序不能进行二分查找
for (int i=0;i<n;i++) {
cin>>student[i];
sum+=getTheBestValue(school, student[i]);
}
cout<<sum;
getchar();getchar();
return 0;
}
【C++】洛谷P1678烦人的高考志愿
最新推荐文章于 2024-07-10 22:49:54 发布