又到了丰收的季节,恰逢小易去牛牛的果园里游玩。
牛牛常说他对整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。
在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。
牛牛觉得这个问题太简单,所以希望你来替他回答。
第一行一个数n(1 <= n <= 105)。
第二行n个数ai(1 <= ai <= 1000),表示从左往右数第i堆有多少苹果
第三行一个数m(1 <= m <= 105),表示有m次询问。
第四行m个数qi,表示小易希望知道第qi个苹果属于哪一堆。
m行,第i行输出第qi个苹果属于哪一堆。
5 2 7 3 4 9 3 1 25 11
1 5 3
import sys import bisect while True: line = sys.stdin.readline() if not line: break n = int(line) A = list(map(int, sys.stdin.readline().split())) m = int(sys.stdin.readline()) Q = list(map(int, sys.stdin.readline().split())) sum1 = 0 for i in range(n): sum1 += A[i] A[i] = sum1 for q in Q: index = bisect.bisect(A,q-0.5) # 如果q等于A里面的某个元素会被插到后面,所以减一下 print(index+1)
def bisect_left(data, key): if not data: raise ValueError('Invail Input') low, high = 0, len(data) - 1 while low < high: mid = (low + high) // 2 if key > data[mid]: low = mid + 1 else: high = mid return low n = int(input()) data = list(map(int, input().split())) q = int(input()) query = list(map(int, input().split())) max_count = [0] * (n + 1) for i in range(1, n + 1): max_count[i] = max_count[i-1] + data[i-1] for i in query: print(bisect_left(max_count, i))
# 二分查找 def BST(a,left,right,target): while(left<=right): mid = left + (right - left)//2 if a[mid] > target: right = mid if a[mid] < target: left = mid if a[mid] == target: return mid if right == left + 1: return right while True: try: n = int(input()) a = list(map(int,input().strip().split(' '))) m = int(input()) q = list(map(int,input().strip().split(' '))) temp = 0 new_a = [0] for i in a: temp = temp + i new_a.append(temp) for qq in q: print(BST(new_a,0,len(new_a)-1,qq)) except: break
if __name__=='__main__': n=int(input()) apple=list(map(int,input().strip().split())) m=int(input()) query=list(map(int,input().strip().split())) sum=0 dui = [0] for _ in apple: sum+=_ dui.append(sum)#2 9 12 16 25 for i in query: k = 0 j=n while k<=j: if i<dui[j]: j=j-1 elif i>dui[k]: k+=1 else: break print(k)为什么只通过30%,求大佬帮忙解答
# python def fun(): # n = int(input()) # A = list(map(int, input().split())) # m = int(input()) # Q = list(map(int, input().split())) n = 5 A = [2,7,3,4,9] m = 3 Q = [1,15,11] result = [] for q in Q: temp = 0 for i in range(n): temp += A[i] if temp >= q: result.append(i+1) break for r in result: print(r)
#二分法 def binary_search(target,array): l = 0 r = len(array)-1 while l <= r: mid = l + (r-l)//2 if target > array[mid]: l = mid + 1 elif target < array[mid]: r = mid - 1 else: return mid return l n = int(input().strip()) ai = list(map(int,input().strip().split())) m = int(input()) qi = list(map(int,input().strip().split())) ans = [] accum = [0]*n accum[0] = ai[0] for i in range(1,n): accum[i] = accum[i-1]+ai[i] for ques in range(m): print(binary_search(qi[ques],accum)+1)
""" 构建一个前n项求和的序列, 利用bisect找到应该的插入点 """ import sys import bisect if __name__ == "__main__": # sys.stdin = open('input.txt', 'r') n = int(input().strip()) a = list(map(int, input().strip().split())) m = int(input().strip()) q = list(map(int, input().strip().split())) a_sum = [1] for i in range(n): a_sum.append(a_sum[-1] + a[i]) for i in range(m): ans = bisect.bisect(a_sum, q[i]) print(ans)
# 这四行捕获输入 d_num = int(input()) d = [int(x) for x in input().split()] query_num = int(input()) query_id = [int(x) for x in input().split()] # 处理苹果堆列表,第n位上的数据为前n堆苹果的总数 for index in range(1, len(d)): d[index] += d[index - 1] # 显然d现在是一个增序序列,使用标准库bisect中的bisect_left函数即可 # 直接,得到结果。 # 这个函数使用二分查找算法找出在一个有序序列中,保持有序的前提下, # 插入某一个数可行的插入位置,有相同值时插入到相同值的最左侧。 # 仿标准库中bisect的实现: def bisect_left(a, needle): start = 0 # 起点空位索引 end = len(a) # 终点空位索引 while start < end: mid = (start + end) // 2 if needle > a[mid]: # 当needle比a[mid]大时,位点必然出现在mid右侧, # 右侧的第一个空位索引为mid + 1,把起点设为mid + 1 start = mid + 1 else: # 如果needle <= a[mid],位点出现在左侧, # 左侧的第一个空位索引为mid,所以终点设为mid end = mid return start for apple_id in query_id: print(bisect_left(d, apple_id) + 1)
if __name__ == '__main__': count1 = int(input()) count2=input() listq = count2.split(' ') listq = list(map(int,listq)) query1 = int(input()) count3=input() count3=count3.split(' ') query_list=list(map(int,count3)) apple_sum=[0 for _ in range(count1)] sums=0 for i in range(count1): sums+=listq[i] apple_sum[i]=sums def BinarySearch1(array,t): asc=0 low = 0 height =len(array) - 1 while height>= low: mid =(low + height) // 2 if array[mid] >= t: asc=mid height =mid - 1 else : low =mid + 1 return asc for j in range(query1): mid=BinarySearch1(apple_sum,query_list[j]) print(mid+1)
参考楼上python的,
二分法搜索def main():