A問題 500 Yen Coins
解答
1 2 3 4 5 |
k,x = map(int, input().split()) if x<= 500*k: print('Yes') else: print('No') |
C – Count Order
方針
- N<8と制約が小さいので計算が間に合う(N<10までならN!は間に合う)
- 順列全探索を行う
- itertoolsのpermutationsを使用して順列を作る
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import itertools n=int(input()) P=tuple(map(int,input().split())) #[1] Q=tuple(map(int,input().split())) #[1] count=0 #何番目の順列かを調べるためのカウンタ permutations=list(itertools.permutations(range(1,n+1))) #[2]順列の生成 for i in permutations: #[3]生成した全ての順列を探索 if P==i: #Pとi番目の順列が一致した場合 a=count #何番目かを記録 if Q==i: #Pとi番目の順列が一致した場合 b=count #何番目かを記録 count+=1 ans=abs(a-b) print(ans) |
[1]タプルに変更する
タプルはリストとは違って要素を変更することができないイテレータです。
誤って中身を変更したくないデータを扱う時などに使えます。
順列を生成するitertoolsのpermutationsを使うと、それぞれの順列はタプルで返されるようなので、P,Qが一致するかを判定するためにタプルに変更しています。
[2]順列の生成
順列の生成については参考からリンクしている公式ドキュメントがお勧めです。
若干読みづらいので、面倒な場合はこのサイトの便利技集の記事で順列の項目をご覧ください。(後で必ず公式ドキュメントは見てください。)
“permutations=list(itertools.permutations(range(1,n+1)))”を分解します。
①
“range(1,n+1)”は1からnまでの連続した数値を要素として持つオブジェクトを作ります。
今回の問題では、1からnまでの数字を使って順列を作成するための引数として使っています。
②
“itertools.permutations(r,N)”とすることで順列を作ることができます。Nは省略することができます。
今回は、”itertools.permutations(range(1,n+1))”とすることで1からnまでの数字を使って順列を作ります。(第二引数であるNは省略しています。)
③
“list(itertools.permutations(range(1,n+1)))”でリストに変更しています。
④
“permutations=list(itertools.permutations(range(1,n+1)))”で変数であるpermutationsに生成した順列を代入しました。
[3]全探索で順列とP,Qが一致するか判定
変数permutationsに代入された全ての順列を探索します。
それぞれの順列がiに代入されて順番にP,Qと一致するかをif文で判定していますが、
[1]でタプルに変更したのは、iに入っている順列がタプルだからです。
iとP,Qが一致したらその時のcountの値をa,bに代入し、その差の絶対をansに代入してprintしました。
参考
公式ドキュメントです。permutationの項目を見ながら何回か順列を作ってみて慣れると良いと思います。
itertools — 効率的なループ実行のためのイテレータ生成関数 — Python 3.9.4 ドキュメント
こちらの記事で順列の生成について簡単にまとめました。
Python便利技集 | Best Practice (find-best-practice.com)
類題
コメント