丰收(网易(二分))

在这里插入图片描述
我的思路:先找出每一堆的上界,构成一个数组(显然是升序数组),然后二分法找到等于q的数的下标(如果有)或第一个大于q的数的下标即可。代码如下,直接AC。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int binarySearch(vector<int>&a, int target)
{
	int low = 0, high = a.size() - 1;
	while (low <= high)
	{
		int mid = (low + high) / 2;
		if (a[mid] == target)
		{
			return mid;
		}
		else if (a[mid] < target)
		{
			low = mid + 1;
		}
		else
			high = mid - 1;
	}
	return low;//注意

}
int main() {
	int n;
	cin >> n;
	vector<int>apple_sum(n + 1, 0);//第i堆的上界
	for (int i = 1; i <= n; ++i) {
		int temp;
		cin >> temp;
		apple_sum[i] = apple_sum[i - 1] + temp;
	}
	int m, q;
	cin >> m;
	for (int i = 0; i != m; ++i) {
		cin >> q;
		cout << binarySearch(apple_sum, q) << endl;//二分找到等于q的数的下标(如果有)或第一个大于q的数的下标
	}
	return 0;
}

网上看到另一种思路,利用vector的lower_bound函数:

//lower_bound找出第一个键不小于k的元素的迭代器
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
	int n;
	cin >> n;
	vector<pair<int, int>>apple_sum(n + 1, { 0,0 });//“键-值”对为“第i堆的上界-第i堆”
	for (int i = 1; i <= n; ++i) {
		int temp;
		cin >> temp;
		apple_sum[i] = { apple_sum[i - 1].first + temp,i };
	}
	int m, q;
	cin >> m;
	for (int i = 0; i != m; ++i) {
		cin >> q;
		cout << lower_bound(apple_sum.begin(), apple_sum.end(), make_pair(q, 0))->second << endl;
	}
	return 0;
}
发布了212 篇原创文章 · 获赞 4 · 访问量 8796

猜你喜欢

转载自blog.csdn.net/ShenHang_/article/details/104614142