白峻2075号N次大数.


ウィンドウをスライドさせる方法で解こうとしますが、考えてみれば、優先キューを利用してアクセスするのはほとんど似たような方法です.
スライドウィンドウ(最低価格の例を検索)
  • 0行と1行の情報を比較し、最値を格納します.
  • 以降、その結果を2行目の情報と比較し、以前に検索された0行目の情報の再発見を回避するために「ウィンドウ」として区間を移動する.
  • 最初に、論理は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で何も保存されないので、最後のprintindex 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)の時間的複雑さが改善されることを学習した.しかし、意外にも簡単に考えれば、もっと簡単で、もっと速いアルゴリズムが思いつくかもしれません.なんと貼り付けとカットの仕方...思いもよらなかった.