我的思路:先找出每一堆的上界,构成一个数组(显然是升序数组),然后二分法找到等于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;
}