[BOJ 1838]泡揃え(Python)
質問する
https://www.acmicpc.net/problem/1838
並べ替え完了時に変数iに格納された値を求める問題
問題を解く
[エラーコード:道現のコードに従って使用]
for (i=0; i<N; i++) {
flag = 0;
for (j=0; j<N-1; j++) {
if (A[j] > A[j+1]) {
flag = 1;
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
}
if (flag == 0) {
break;
}
}
これは道現がタイに勝つために書いたコードです.バブルソートを使用して、要素を前から順に整理します.
ソートが不要になった場合にiを出力します.
このコードはPythonコードで作成され、提出されました.
[結果]
タイムアウトしました.もちろんです.
問題で与えられた要素の個数は
500,000
であり、上記のコードはO(n^2)
である.では、演算量は
250,000,000,000
個で、与えられた2秒以内に計算が完了しない.[正しい]
問題のiが何を意味するかを考えると、簡単に解けます.
i並べ替えは不要なので、停止すると何回並べ替えたかを示す.
Bubbleソートでは、ソートのたびに最大値が最後に移動します.
これにより、[後方に移動した値](Move After Value)で[最大移動距離](Move After Max Distance)を見つけることができます.
つまり、「ソート前索引-ソート後索引>0」の値で最大値を見つけることができます.
コード#コード#
import sys
from collections import defaultdict
input = sys.stdin.readline
n = int(input())
a = list(map(int,input().rsplit()))
before = defaultdict(int)
for i,num in enumerate(a):
before[num]=i
a.sort()
after = defaultdict(int)
for i,num in enumerate(a):
after[num] = i
answer = 0
for num in before:
minus = before[num] - after[num]
if (minus > 0 and minus > answer):
answer = minus
print(answer)
Reference
この問題について([BOJ 1838]泡揃え(Python)), 我々は、より多くの情報をここで見つけました https://velog.io/@uoayop/BOJ-1838-버블-정렬Pythonテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol