自分用メモ

プログラミングとかのメモを書きたいです

問題

atcoder.jp

挑戦結果

  • 挑戦日:2021/10/31
  • 結果:解けた
  • 時間:15分

考えたこと

  • 1周して戻るときは、modをとって計算
  • しゃくとり法の感じで、現在が求めたい面積より多いときは縮める、少ないときは伸ばすをしていき、見つかるかどうかを行えば良い

公式解説

https://twitter.com/e869120/status/1408599656209080322

解説を読んだふりかえり

  • 模範解法は円環を列にして二倍しておき、累積和をとっておき、開始位置を1~N-1とした上で、二分探索で求めたい面積があるかを調べるだった。
  • しゃくとり法のほうが実装もしやすいような気はした。

ソース

N = int(input())
A = [int(x) for x in input().split()]

# トータルの大きさ
all = sum(A)

# 現在の大きさ(先頭0、末尾0)
cur = A[0]
s,e = 0,0
ans = "No"
# 開始位置は一周しない。終了位置-開始位置で長さチェック
while s<N and e-s<N:
    # 十分の一が見つかったら終了
    if cur * 10 == all:
        ans = 'Yes'
        break
    # 小さいときは、末尾を拡大する
    elif cur * 10 < all:
        e += 1
        cur += A[e%N]
    # 大きいときは、先頭を縮める
    elif cur * 10 > all:
        cur -= A[s]
        s += 1

print(ans)