質問するログイン新規登録

Q&A

2回答

507閲覧

競技プログラミングのソート比較に関する質問

kotamu

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/02/09 11:25

編集2022/02/09 11:26

0

0

ソートアルゴリズムに関する質問です。
競技プログラミングの問題(Python)なのですが、

数字の書かれた玉(数字は適当で重複もアリ)があり、左から一列に並べます。このとき任意の玉の数字より大きい数字の玉が左に2個以上こない並び方が何通りあるか求めよ。

[入力形式]
玉の数
数字1,数字2,…

[解答例]
3
2 1 3
のとき
4通り

3
1 2 2
のとき
4通り
これの解き方が分かりません。
実行時間とメモリの関係上、forを何重にもする方法は不適切かと思われます。
どなたか、Pythonのコードで解法を示していただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

hoshi-takanori

2022/02/09 11:37

> 実行時間とメモリの関係上、forを何重にもする方法は不適切かと思われます。 まずその書き方で書いてみてから、その先のことを考えれば良いのでは…。
actorbug

2022/02/09 20:47

> 3 > 1 2 2 > のとき > 4通り 「1 2 2」「2 1 2」の2通りじゃないの?
guest

回答2

0

まずは愚直な方法で解いてみて、結果から法則を読み取ってみてはいかがでしょうか。

すべての順列から条件に合うものを数えると(ついでに該当の順列を表示)、以下のようになります。

python

1import itertools 2 3a = [1,2,3,4] 4count = 0 5for p in itertools.permutations(a): 6 if all(sum(p[j] > p[i] for j in range(i)) <= 1 for i in range(2, len(p))): 7 print(p) 8 count += 1 9 10print(count)

こちらの実行結果は以下のようになります。

text

1(1, 2, 3, 4) 2(1, 2, 4, 3) 3(1, 3, 2, 4) 4(1, 4, 2, 3) 5(2, 1, 3, 4) 6(2, 1, 4, 3) 7(3, 1, 2, 4) 8(4, 1, 2, 3) 98

この並びを見て、法則を見いだせないでしょうか。
最大の数の位置が同じものを並べると、より分かりやすいかもしれません。

text

1(1, 2, 3, 4) 2(2, 1, 3, 4) 3(1, 3, 2, 4) 4(3, 1, 2, 4) 5 6(1, 2, 4, 3) 7(2, 1, 4, 3) 8 9(1, 4, 2, 3) 10 11(4, 1, 2, 3)

投稿2022/02/11 19:17

actorbug

総合スコア2555

0

大きい数字の玉から置いていくと計算しやすいですよ

投稿2022/02/09 12:43

yudedako67

総合スコア2052

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問