LoginSignup
0
0

More than 1 year has passed since last update.

ABC189 C - Mandarin Orange に痺れた

Last updated at Posted at 2021-10-08

abc189_1.png
abc189_2.png
abc189_3.png

わ、わからん。
解答 please

うーん、わかったのかな。
とりあえず、分かったつもりになって書いてみた。

MandarinOrange.py
N = int(input())
A = list(map(int,input().split()))

def solv():
    ans = 0
    for l in range(N):
        ref = A[l]
        for r in range(l,N):
            ref = min(ref,A[r])
            ans = max(ans,ref*(r-l+1))
    print(ans)

solv()

Python では間に合わないので
PyPy にしないと通らないのでご注意ください。


あれから真っ新で再チャレンジ。
以下の記述で WA。

abc189c_wa.py
def solv():
    N = int(input())
    A = list(map(int,input().split()))
    lis = []
    for i in range(N):
        ref = A[i]
        score = 0
        for j in range(i,N):
            if A[j] < ref:break
            score += ref
        lis.append(score)
    print(max(lis))
solv()

なぜダメなのだろうか。
random_01.txt をダウンロードして
WA/AC を比較してみた。
具体的には、最大合計値、左端、右端を printを使って表示してみる

AC 合計値 901408/ 左端 1429/右端 1445
WA 合計値 125322/ 左端 1429/右端 1431

ご覧のとおりスタート地点は同じだが右端で切れている位置が異なる。
なぜ?
AC/WA には記述に根本的な差がある。

AC : 左端から最小値を更新しながら探索するので、連続してカウントする数を伸ばしている
WA : 左端を最小値とし、最小値以上で連続してないとカウントを止めてしまう

冷静に考えて前者の AC の考え方じゃないと all case を満たした回答が出来ないのではなかろうか?

以上のようにイメージし直すと、
AC の記述に自力で辿り着き、見事 AC となった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0