丰收

题目描述
又到了丰收的季节,恰逢小易去牛牛的果园里游玩。
牛牛常说他对整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。
在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。
牛牛觉得这个问题太简单,所以希望你来替他回答。

输入描述:
第一行一个数n(1 <= n <= 105)。
第二行n个数ai(1 <= ai <= 1000),表示从左往右数第i堆有多少苹果
第三行一个数m(1 <= m <= 105),表示有m次询问。
第四行m个数qi,表示小易希望知道第qi个苹果属于哪一堆。

输出描述:
m行,第i行输出第qi个苹果属于哪一堆。

 1 def main():
 2     N = int(input())
 3     apples = list(map(int,input().split()))
 4     # N = 5
 5     # apples = [2,7,3,4,9]
 6 
 7     apples.insert(0,0)
 8     for i in range(1,N+1):
 9         apples[i] += apples[i-1]
10     
11     M = int(input())
12     questions = list(map(int,input().split()))
13     # print(apples)
14     # M = 3
15     # questions = [1,25,11]
16     for i in range(M):
17         cur = questions[i]
18         l,r = 0,N
19         while l <= r:
20             m = l + (r - l) // 2
21             if cur == apples[m]:
22                 print(m)
23                 break
24             elif cur < apples[m]:
25                 if m - 1 >= 0 and cur > apples[m-1]:
26                     print(m)
27                     break
28                 else:
29                     r = m - 1
30             elif cur > apples[m]:
31                 if m + 1 <= N and cur < apples[m+1]:
32                     print(m+1)
33                     break
34                 else:
35                     l = m + 1
36             else:
37                 print('error')
38 
39 if __name__ == '__main__':
40     main()

算法思路:二分查找(变形)

寻找有序数组中右边界值。可以使用:itertools.accumulate()和bisect.bisect_left()方法简化代码。

posted on 2019-08-02 19:25  Sempron2800+  阅读(158)  评论(0编辑  收藏  举报