Bootstrap

蓝桥杯备考:二分算法之烦恼的高考志愿

这道题我们把学校录取分数线存在数组里并且排序,然后枚举学生实际分数,用二分查找找出大于等于实际分数的最初位置,该位

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
typedef long long LL;
int a[N];
int m, n;
int find(int x)
{
	int left = 1, right = m;
	while (left < right)
	{
		int mid = left + (right - left) / 2;
		if (a[mid] >= x) right = mid;
		else left = mid + 1;
	}
	return left;
}
int main()
{
	cin >> m >> n;
	LL ret = 0;
	for (int i = 1; i <= m; i++) cin >> a[i];
	a[0] = -1e7;
	sort(a + 1, a + 1 + m);
	while (n--)
	{
		int x; cin >> x;
		int pos = find(x);
		ret += min(abs(a[pos] - x), abs(a[pos - 1] - x));
	}
	cout << ret << endl;

	return 0;
}

置减1就是小于它的最终位置,然后比较这两个位置的值哪个和实际分数最接近,如果数组就一个元素的话就会发生越界,这时候我们只要安一个左护法就行了,左护法多大呢?假如我们的分数是10的六次方的话,预估分数是0的话,最多差值就是10的六次方,我们只要让左护法比10的六次方大就行了

;