### o079. 4. 最佳選擇 ###### 2024年6月 ###### Python ```python= def search_max(maxright,nums,maxnum): if maxnum<=0 or len(nums)==0 or psum[nums[0]]>maxnum or maxright==0:return -1 left,right=0,len(nums)-1 while left<=right: mid=(left+right)//2 if nums[mid]<maxright and psum[nums[mid]]<=maxnum:left=mid+1 else:right=mid-1 if right==-1:return -1 return nums[right] def check(): ans=0 temp=search_max(n,left[0],k) if temp>=0:ans=psum[temp] for item in right: if 0-item in left: for r in right[item]: temp=search_max(r,left[0-item],k-ssum[r]) if temp>=0: total=psum[temp]+ssum[r] ans=max(ans,total) return ans from itertools import accumulate from collections import defaultdict import bisect n,k=map(int,input().split()) nums=list(map(int,input().split())) psum=list(accumulate(nums)) ssum=list(accumulate(nums[-1::-1]))[-1::-1] odd_even=list(map(lambda x:2*(x%2)-1,nums)) left =list(accumulate(odd_even)) right=list(accumulate(odd_even[-1::-1]))[-1::-1] temp=defaultdict(list) for index,item in enumerate(left):bisect.insort(temp[item],index) left=temp temp=defaultdict(list) for index,item in enumerate(right):bisect.insort(temp[item],index) right=temp print(check()) ```