二分找答案
Music Notes
https://ac.nowcoder.com/acm/problem/24866
二分找答案,用一个前缀和,不然会超时x
要注意的地方:
1.什么时候右边界收缩,什么时候左边界收缩。
2.找到答案时,l,r区间不存在,答案出现在l处,即r+1处。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int a[50009]; long long sum[50009]; long long n , m , q; bool check(int ans) { long long temp = 0; /*for(int i = 1;i <= ans;i++) { temp += a[i]; if(temp > q)break; }*/ temp += sum [ans]; return temp > q; } int main() { cin>> n >> m; for(int i = 1;i <= n;i++) cin>>a[i],sum[i] = sum[i - 1] + a[i]; while( m-- ) { cin >> q; int l = 1,r = n, mid; while( l <= r ) { mid = (l + r) >> 1; if( !check(mid) ) l = mid + 1; else r = mid - 1; } cout<< l << "\n"; } return 0; }