[BOJ] 2670. 連続部分最大乗算


質問する


N個のエラーが発生した場合、1つ以上の連続数の積が最大の部分を見つけ、プログラムを作成して積を出力します.例えば、8個の正実数が与えられた場合、以下のようになる.

塗りつぶし部分の積は最大で、値は1.638です.

入力


最初の行は、列挙された数の実数の個数Nを与え、次の行からN個が1行ずつ数えられる.Nは10000以下の自然数です.エラーは、0.0以上9.9以下の小数点第1位に与えられます.

しゅつりょく


算出された最値を小数点以下の4位から四捨五入し、小数点以下の3位に出力します.
import sys  
input = sys.stdin.readline
n = int(input())
dp = []
for _ in range(n):
  dp.append(float(input()))
result = 0
for i in range(n):
  mul = 1
  for j in range(i, n):
    mul *= dp[j]
    dp[i] = max(mul, dp[i])
  result = max(result, dp[i])
print('%.3f'%(result))
出力時
print(round(result, 3))
このようなコードを書くのは間違っています.これで10回以上間違えました.
なぜか分からないが、今はこのように%.3 fを記入すべきだ.
また、Python 3で採点するとタイムアウトが発生します.
BrootForsアルゴリズムを使用しているためかタイムアウトが発生します.
時間制限が1秒なのでこのように解けているのかはわかりません.
二重の原因ではないかと思っていたが、四捨五入の原因だった.
しかし、復習するときは連続部分の最大回数を熟知しなければならない.
21.04.14 Review
n = int(input())
arr = []

for _ in range(n):
  arr.append(float(input()))

ans = 0

for i in range(n):
  mul = 1
  for j in range(i, n):
    mul *= arr[j]
    ans = max(mul, ans)
  
print('%.3f'%(ans))
今度はfor文で間違いを犯しました.
for i in range(n - 1):
  mul = arr[i]
  for j in range(i + 1, n):
    mul *= arr[j]
    ans = max(mul, ans)
  
print('%.3f'%(ans))
の先頭に立つ
mul = arr[i]
このように初期化されました.
初期化状態のみ
ans = max(mul, ans)
max()関数が適用されていないので間違っています.
->mulを1に初期化し、for文で比較できるように変更します.
21.007.09復習
import sys
input = sys.stdin.readline

n = int(input())
arr = []
for _ in range(n):
  arr.append(float(input()))

max_val = max(arr)
for i in range(n - 1):
  mul_val = 1
  sub_max_val = arr[i]
  for j in range(i, n):
    mul_val *= arr[j]
    sub_max_val = max(mul_val, sub_max_val)
  max_val = max(sub_max_val, max_val)

print('%.3f'%max_val)
round関数出力を注意して使えばいいのですが…!