2596: Music Notes
Total Submit: 3 Accepted:3
Description
FJ is going to teach his cows how to play a song. The song consists of N (1 ≤ N ≤ 100) notes, and the i-th note lasts for B_i (1 ≤ B_i ≤ 100) beats. The cows will begin playing the song at time 0; thus, they will play note 1 from time 0 to time B_1 - 1, note 2 fromtime B_1 to time B_1 + B_2 - 1, etc.
The cows have lost interest in the song, as they feel that it is long and boring. Thus, to make sure his cows are paying attention, FJ asks them Q (1 ≤ Q ≤ 1,000) questions of the form, "During the beat at time T_i (0 ≤ T_i < length of song), which note should you be playing?" The cows need your help to answer these questions.
By way of example, consider a song with these specifications: note 1 for length 2, note 2 for length 1, and note 3 for length 3:
NOTES 1 1 2 3 3 3 +---+---+---+---+---+---+ TIME 0 1 2 3 4 5
Input
* Line 1: Two space-separated integers: N and Q
* Lines 2..N+1: Line i+1 contains a single integer: B_i
* Lines N+2..N+Q+1: Line N+i+1 contains a single integer: T_i
Output
* Lines 1..Q: Line i contains the a single integer that is the note the cows should be playing at time T_i
Sample Input
3 5
2
1
3
2
3
4
0
1
Sample Output
2
3
3
1
1
这么简单的题怎么没有人写题解,你有n首歌,问你可以听到第几首,前缀和处理下,然后二分直接输出啊
#include<stdio.h> int a[105],n,q; int BS(int x) { int l=1,r=n; while(l<=r) { int mi=(l+r)/2; if(a[mi]>x)r=mi-1; else l=mi+1; } return l; } int main() { while(~scanf("%d%d",&n,&q)) { scanf("%d",&a[1]); for(int i=2;i<=n;i++) { scanf("%d",&a[i]); a[i]+=a[i-1]; } while(q--) { int x;scanf("%d",&x); printf("%d ",BS(x)); } } return 0; }
原题数据范围应该很大,这个暴力复杂度都还正常
#include<stdio.h> #include<algorithm> using namespace std; int a[105],n,q; int main() { while(~scanf("%d%d",&n,&q)) { scanf("%d",&a[1]); for(int i=2;i<=n;i++) { scanf("%d",&a[i]); a[i]+=a[i-1]; } while(q--) { int x;scanf("%d",&x); printf("%d ",(int)(upper_bound(a+1,a+n+1,x)-a)); } } return 0; }