题目描述
又到了丰收的季节,恰逢小易去牛牛的果园里游玩。
牛牛常说他对整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。
在果园里有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()方法简化代码。
原文地址:https://www.cnblogs.com/asenyang/p/11290770.html
时间: 2024-10-09 03:15:49