开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天,点击查看活动详情
[USACO 2009 Dec S]Music Notes
链接:ac.nowcoder.com/acm/problem…
来源:牛客网
FJ is going to teach his cows how to play a song. The song consists of N (1 <= N <= 50,000) notes, and the i-th note lasts for Bi (1 <= Bi <= 10,000) beats (thus no song is longer than 500,000,000 beats). The cows will begin playing the song at time 0; thus, they will play note 1 from time 0 through just before time B1, note 2 from time B1 through just before time B1 + B2, etc.
However, recently the cows have lost interest in the song, as they feel that it is too long and boring. Thus, to make sure his cows are paying attention, he asks them Q (1 <= Q <= 50,000) questions of the form, "In the interval from time T through just before time T+1, which note should you be playing?" The cows need your help to answer these questions which are supplied as Ti (0 <= Ti <= end_of_song).
Consider this song with three notes of durations 2, 1, and 3 beats:
Beat: 0 1 2 3 4 5 6 ...
|----|----|----|----|----|----|--- ...
1111111111 : :
22222: :
333333333333333:
Here is a set of five queries along with the resulting answer:
Query Note
2 2
3 3
4 3
0 1
1 1
输入描述:
* Line 1: Two space-separated integers: N and Q
* Lines 2..N+1: Line i+1 contains the single integer: Bi
* Lines N+2..N+Q+1: Line N+i+1 contains a single integer: Ti
输出描述:
* Lines 1..Q: Line i of the output contains the result of query i as a single integer.
示例1
输入
3 5
2
1
3
2
3
4
0
1
输出
2
3
3
1
1
思路
这个题用的算法就是前缀和加二分优化时间,还是熟悉的二分模板,然后读入的时候对数组进行处理,最后输出出来这个序列就行了。注意他要求的序列其实就是所有数组值的二分答案。最重要的还是二分边界的问题,不要弄错了就好啦,qwq。
代码
#include<bits/stdc++.h>
using namespace std;
int b[500010];
int main()
{
int n,q;
scanf("%d %d",&n,&q);
memset(b,0,sizeof(b));
for (int i =1 ;i<=n;i++)
{
scanf("%d",&b[i]);
b[i]+=b[i-1];
}
for (int i =1 ;i<=q;i++)
{
int x;
scanf("%d",&x);
int l =1 , r=n;
while (l<=r)
{
int mid=(l+r+1)/2;
if(x>=b[mid]) l=mid+1;
else r=mid-1;
}
printf("%d\n",l);
}
return 0;
}