問題はこちら
2完
A
連続部分列の和の最大/最小を求めればよい。
N, C = list(map(int, input().split())) A = list(map(int, input().split())) # print(N,C,A) def max_subarray(nums): max_sum = nums[0] # 最大の合計を保持する変数を初期化 current_sum = nums[0] # 現在の部分列の合計を保持する変数を初期化 # リストの各要素を順番にチェックして最大部分配列を求める for num in nums[1:]: # 現在の部分列の合計に次の要素を追加した場合と、次の要素単独の値を比較して大きい方を選択する current_sum = max(num, current_sum + num) # 現在の部分列の合計が最大合計よりも大きければ更新する max_sum = max(max_sum, current_sum) return max_sum def min_subarray(nums): min_sum = float('inf') # 最小の合計を保持する変数を初期化 current_sum = 0 # 現在の部分列の合計を保持する変数を初期化 # リストの各要素を順番にチェックして最小部分配列を求める for num in nums: current_sum += num # 現在の部分列の合計が最小合計よりも小さければ更新する min_sum = min(min_sum, current_sum) # 現在の部分列の合計が0以下になったら初期化する if current_sum > 0: current_sum = 0 return min_sum # total_sum = sum(A) if C > 0: max_sum = max_subarray(A) print(max(total_sum, total_sum - max_sum + max_sum*C)) else: min_sum = min_subarray(A) print(max(total_sum, total_sum - min_sum + min_sum*C))
B
考え方はあっていたのだが、途中の割り算でfloat型を使っていたせいでWAとなっていた。
無駄なfloat型はやめよう(自戒)
T = int(input()) for _ in range(T): A = list(map(int, input().split())) P = list(map(int, input().split())) total_score = 0 for i in range(5): total_score += A[i]*(i+1) need_score = 3*sum(A) - total_score # print(total_score, need_score) # 必要な金額を求める if need_score <= 0: print(0) else: if P[-2] <= P[-1]/2: print(int(P[-2]*need_score)) else: if need_score%2 == 0: print(int(P[-1]*need_score//2)) else: # 奇数の時 print(int(P[-1]*(need_score//2) + min(P[-2], P[-1])))
C
D
E
F