题目链接:http://codeforces.com/problemset/problem/302/B
题目意思:给出两个整数n和m,接下来n行给出n首歌分别的奏唱时间和听的次数,紧跟着给出m个时刻,需要对每个时刻输出该时刻正在弹奏哪一首歌曲。
解题关键是每个时刻v有着这样的规律vi?<?vi?+?1 (i?<?m),即询问的时刻是递增的!因此可以先存储每一首歌的总占时间:c*v。接着对于第一个给定的时刻,可以从第一首歌开始统计,直到超过询问的时刻。由于递增,因此下一首歌不需要从头开始再算,只需要从上一次的统计时间继续相加即可。
至于二分法也可以解决......本人较笨,只会用暴力......
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 using namespace std; 5 6 const int maxn = 1e5 + 5; 7 __int64 song[maxn], c, t, v, cnt; 8 9 int main() 10 { 11 int n, m, i, j; 12 while (scanf("%d%d", &n, &m) != EOF) 13 { 14 for (i = 1; i <= n; i++) 15 { 16 scanf("%I64d%I64d", &c, &t); // c,t最大为1e9,需要64位整型 17 song[i] = c * t; 18 } 19 cnt = 0; 20 for (j = i = 1; i <= m; i++) 21 { 22 scanf("%I64d", &v); 23 while (cnt < v && j <= n) 24 cnt += song[j++]; 25 printf("%d\n", j-1); 26 } 27 } 28 return 0; 29 }