[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
関数出力を注意して使えばいいのですが…!Reference
この問題について([BOJ] 2670. 連続部分最大乗算), 我々は、より多くの情報をここで見つけました https://velog.io/@ayoung0073/baekjoon-2670-연속부분최대곱テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol