社区讨论

二分查找,只有60分,#2,#3,#9,#10没过,请求高手支援

P1678烦恼的高考志愿参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo2thspm
此快照首次捕获于
2023/10/23 19:31
2 年前
此快照最后确认于
2023/10/23 19:31
2 年前
查看原帖
CPP
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
int m, n;
vector<int> school;
vector<int> student;
vector<int> my_index;
int check(int school_index, int student_index);
int binary_search(int x);
int main() {
	cin >> m >> n;
	for (int i = 1; i <= m; i++) {
		int x;
		cin >> x;
		school.push_back(x);
	}
	for (int i = 1; i <= n; i++) {
		int x;
		cin >> x;
		student.push_back(x);
	}
	sort(school.begin(), school.end());
	sort(student.begin(), student.end());
	for (int i = 0; i <= n - 1; i++) {
		my_index.push_back(binary_search(i));
	}
	long long int ans = 0;
	for (int i = 0; i <= n - 1; i++) {
		if (i - 1 < 0) {
			ans += school[my_index[i]] - student[i];
		} else {
			ans += min(school[my_index[i]] - student[i],
			           student[i] - school[my_index[i]-1]);
		}
	}
	cout << ans;
	return 0;
}
int binary_search(int x) {
	int ans = 0;
	int left = 0;
	int right = m - 1;
	while (left <= right) {
		int mid = (left + right) >> 1;
		if (check(mid, x)) {
			ans = mid;
			right = mid - 1;
		} else {
			left = mid + 1;
		}
	}
	return ans;
}
int check(int school_index, int student_index) {
	if (student[student_index] <= school[school_index]) {
		return 1;
	} else {
		return 0;
	}
}

回复

1 条回复,欢迎继续交流。

正在加载回复...