ARC174 python Atcoderの記録

問題はこちら
2完

A
連続部分列の和の最大/最小を求めればよい。

ark4rk.hatenablog.com

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