题目描述:
又到了丰收的季节,恰逢小易去牛牛的果园里游玩。
牛午常说他对整个果园的每个地方都了如指掌,小易不太相信,
所以他想考考牛牛。
在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往
右数第x个苹果是属于哪一堆的。
牛牛觉得这个问题大简单,所以希望你来着他回答。
输入描述:
第一行一个数n(1<=n<=100000)
第二行n个数ai(1<=ai<=1000),表示从左往右数第i堆有多少苹果
第三行一个数m(1<=m<=100000),表示有m次询口。
第四行m个数,表示小易希望知道第qi个苹果属于哪一堆。
测试样例:
5
2 7 3 4 9
3
1 25 11
输出
1
5
3
思路:
前缀和+二分
第i个位置表示前i堆苹果总数量,利用二分查找输入苹果所在的位置
代码:
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <queue> #include <map> #include <list> #include <utility> #include <set> #include <algorithm> #include <deque> #include <vector> #define IO ios::sync_with_stdio(false);\ cin.tie(0); cout.tie(0); using namespace std; typedef long long ll; typedef vector<int > vi; const ll INF = 0x3f3f3f3f; const int mod = 1e9 + 7; const int MAX = 100000 + 5; int a[MAX]; int front_a[MAX]; int main() { int n,m; scanf("%d",&n); for(int i = 1 ; i <= n; i++) { scanf("%d", a + i ); front_a[i] = front_a[i-1] + a[i]; } scanf("%d",&m); while(m--) { int q; scanf("%d",&q); int left = 1,right = n; while(left < right) { int middle = (left+right)/2; if(front_a[middle] < q ) { left = middle+1; } else if(front_a[middle]>q){ right = middle; }else { left = middle; break; } } printf("%d\n",left); } return 0; } /* 5 2 7 3 4 9 3 1 25 11 */
原文地址:https://www.cnblogs.com/GHzz/p/9461409.html
时间: 2024-10-03 19:28:24