白峻2075号N次大数.
ウィンドウをスライドさせる方法で解こうとしますが、考えてみれば、優先キューを利用してアクセスするのはほとんど似たような方法です.
スライドウィンドウ(最低価格の例を検索)0行と1行の情報を比較し、最値を格納します. 以降、その結果を2行目の情報と比較し、以前に検索された0行目の情報の再発見を回避するために「ウィンドウ」として区間を移動する. 最初に、論理は
メモリを減らすことが重要です.指定したテーブルを格納する場合は4 byte*(NxN)、最大Nは1500なので、スペースの複雑さは
4∗1500∗1500=9000000(byte)4 * 1500 * 1500 = 9000000(byte)4∗1500∗1500=9000000(byte)
約9 MBで十分です.ただし、メモリがオーバーフローします.
いずれにしても、
だから以下のように修正します.(
比較的原始的な方法かもしれないが、最初の行を
各行を比較し続けると,少し油断するとO(N 2)O(N^2)O(N 2)O(N 2)O(N 2)の時間的複雑さがあり,優先順位キューによりNlog(N)Nlog(N)の時間的複雑さが改善されることを学習した.しかし、意外にも簡単に考えれば、もっと簡単で、もっと速いアルゴリズムが思いつくかもしれません.なんと貼り付けとカットの仕方...思いもよらなかった.
スライドウィンドウ(最低価格の例を検索)
heap
のサイズを5に維持し、最大数よりも大きい数を探索したときにheap
に押し込む.メモリを減らすことが重要です.指定したテーブルを格納する場合は4 byte*(NxN)、最大Nは1500なので、スペースの複雑さは
4∗1500∗1500=9000000(byte)4 * 1500 * 1500 = 9000000(byte)4∗1500∗1500=9000000(byte)
約9 MBで十分です.ただし、メモリがオーバーフローします.
pypy
を試してみると戻りますが、index error
が発生しました.いずれにしても、
python3
で採点すると、基本的にメモリ容量を占めています.(ライブラリのせいかもしれません)import sys
import heapq
N = int(sys.stdin.readline())
table = []
for _ in range(N):
table.append(list(map(int, sys.stdin.readline().split())))
maxi = table[0][0]
heap = []
for i in range(N):
for j in range(N):
if table[i][j] > maxi:
heapq.heappush(heap, table[i][j])
if len(heap) > N:
heapq.heappop(heap)
print(heap[0])
pypy
で何か質問があり、Nが1ならmaxi
が正解そのものならheap
で何も保存されないので、最後のprint
でindex error
に遭遇!だから以下のように修正します.(
table
度正接形式構成)import sys
import heapq
N = int(sys.stdin.readline())
heap = []
for _ in range(N):
table = list(map(int, sys.stdin.readline().split()))
for item in table:
heapq.heappush(heap, item)
if len(heap) > N:
heapq.heappop(heap)
print(heap[0])
これで合格し、上位の正解コードを見て、ずっときれいになりました.比較的原始的な方法かもしれないが、最初の行を
table
に保存し、次の行をtable
の後ろに貼り付け、逆順に並べて最大の5つの数しか残っていない.これでいいですか?感じますimport sys
N = int(sys.stdin.readline())
table = list(map(int, sys.stdin.readline().split()))
for _ in range(N - 1):
table += list(map(int, sys.stdin.readline().split()))
table = sorted(table, reverse=True)[:N]
print(table[N-1])
TIL
各行を比較し続けると,少し油断するとO(N 2)O(N^2)O(N 2)O(N 2)O(N 2)の時間的複雑さがあり,優先順位キューによりNlog(N)Nlog(N)の時間的複雑さが改善されることを学習した.しかし、意外にも簡単に考えれば、もっと簡単で、もっと速いアルゴリズムが思いつくかもしれません.なんと貼り付けとカットの仕方...思いもよらなかった.
Reference
この問題について(白峻2075号N次大数.), 我々は、より多くの情報をここで見つけました https://velog.io/@gyojin-bot/2-백준-2075번-N번째-큰-수テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol