AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。
出典:
AtCoder Beginner Contest 011 C – 123引き算
最短手数を貪欲法で求め、条件に合うかどうかを確認する問題。貪欲法と書くと難しく聞こえるが、要するに目先一番良さそうなものを選んでいく手法のことだ。
実のところ、どの問題に貪欲法が適用可能かどうかを見極めるのは意外と難しいのだが、適用可能であれば簡単に解ける。今回の問題では、ある地点よりも先に進んだ地点のほうが確実に有利だと言える(手前の地点を選んだとしても、手数が増えるだけでいいことがない)ので、貪欲法を用いることが出来る。
def main():
N = int(input())
ng_no = [int(input()) for _ in range(3)]
if N in ng_no:
print('NO')
return
now = N
turn = 0
while now != 0:
if 1 <= now <= 3:
turn += 1
now = 0
else:
if now - 3 not in ng_no:
now -= 3
turn += 1
elif now - 2 not in ng_no:
now -= 2
turn += 1
elif now - 1 not in ng_no:
now -= 1
turn += 1
else:
print('NO')
return
if turn <= 100:
print('YES')
else:
print('NO')
main()
関連