Loading [MathJax]/extensions/tex2jax.js

CODE FESTIVAL 2014 決勝 E – 常ならずグラフ をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
CODE FESTIVAL 2014 決勝 E – 常ならずグラフ

Tさんって誰なのかな(棒)。見通しのいい実装にしようとすると、意外と手こずるかもしれない。

# CODE FESTIVAL 2014 決勝 E - 常ならずグラフ
# https://atcoder.jp/contests/code-festival-2014-final/tasks/code_festival_final_e
# tag: 数列 部分列 Tさん

# 前の値に対して増加するか減少するかのみに注目する。
# (増加も減少もしない場合は無視していい)
# 二回以上連続で増加、あるいは減少する場合には
# 最後の数字のみを採用し、他の数字は取り除けばいい。

# f.e.
# [2, 3, 3, 5, 4, 5, 4, 3, 2, 3, 2, 1]
# なら差分は ↑→↑↓↑↓↓↓↑↓↓ となる。
# 最初の数字は必ず採用するとして、
# この連続する増加と減少の最後の数字のみを取り出すと
# [2, 5, 4, 5, 2, 3, 1] となる感じ。

# ところで、この問題で求める必要があるのは
# 最終的な個数のみ。
# まず、最初と最後の数字は必ずカウントすることになる。
# それに加えて、増加→減少、あるいは減少→増加と変化した
# 回数を数えればいい。


def main():
    N = int(input())
    R = list(map(int, input().split()))

    # 増加してるか、減少してるかだけを取り出す
    diff = []
    for a, b in zip(R, R[1:]):
        if a > b:
            diff.append(-1)
        elif b > a:
            diff.append(1)

    # 最後の数字は必ず採用
    result = 1

    # 増加と減少が入れ替わった回数を数えれば、採用する数字の個数になる
    # 初回を必ずカウントするために前回の増減を 0 とする。
    prev = 0
    for d in diff:
        if d != prev:
            result += 1
        prev = d

    if result >= 3:
        print(result)
    else:
        print(0)

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です