网易校招题之丰收
题目描述
又到了丰收的季节,恰逢小易去牛牛的果园里游玩。
牛牛常说他对整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。
在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。
牛牛觉得这个问题太简单,所以希望你来替他回答。
牛牛常说他对整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。
在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。
牛牛觉得这个问题太简单,所以希望你来替他回答。
输入描述:
第一行一个数n(1 <= n <= 105)。 第二行n个数ai(1 <= ai <= 1000),表示从左往右数第i堆有多少苹果 第三行一个数m(1 <= m <= 105),表示有m次询问。 第四行m个数qi,表示小易希望知道第qi个苹果属于哪一堆。
输出描述:
m行,第i行输出第qi个苹果属于哪一堆。 示例1
输入
5 2 7 3 4 9 3 1 25 11
输出
1 5 3
#include<bits/stdc++.h>
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;//注意,要大于target
}
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;
} 迭代器 lower_bound
在从小到大的排序数组中,
lower_bound( begin,end,num):
从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num):
从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
在从大到小的排序数组中,重载lower_bound()和upper_bound()
lower_bound( begin,end,num,greater<type>() ):
从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
在从大到小的排序数组中,重载lower_bound()和upper_bound()
lower_bound( begin,end,num,greater<type>() ):
从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num,greater<type>() ):
从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<long long> apple;
int n= 0;
int i = 0;
cin>>n;
cin.ignore();
while(n)
{
int m = 0;
cin>>m;
if(apple.size()==0)
{
apple.push_back(m);
}
else
{
apple.push_back(m+apple[i]);
i++;
}
n--;
}
int quire = 0;
cin>> quire;
vector<long long>::iterator it;
while(quire)
{
int m = 0;
cin>>m;
it = lower_bound(apple.begin(),apple.end(),m);//获取迭代器
int ress = it-apple.begin();//获取迭代器所在的位置
cout << ress+1<<endl;
quire--;
}
return 0;
} 
