又到了丰收的季节,恰逢小易去牛牛的果园里游玩。
牛牛常说他对整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。
在果园里有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():