洛谷 2969 音符
解题思路:
前缀和+二分
前缀和比较好办,对于每个输入的 b [ i ] 用数组 s 记录前缀和,由于题目下标是从0开始的,这里对 s 数组中的每一个元素-1.
然后二分查找出一个 >= k 且 比较接近 k 的数,一波二分瞎搞,就AC了!
AC代码:
#include<iostream> #include<cstdio> int n,q,x,ans; int s[50050]; void erfen(int l,int r) { int mid=(l+r)/2; if(l==r) { ans=mid; return; } if(x<=s[mid]) erfen(l,mid); if(x>s[mid]) erfen(mid+1,r); } int main() { scanf("%d%d",&n,&q); for(int i=1;i<=n;++i) { scanf("%d",&x); s[i]=s[i-1]+x; } for(int i=1;i<=n;++i) --s[i]; for(int i=1;i<=q;++i) { scanf("%d",&x); erfen(1,n); printf("%d\n",ans); } }