結果
| 問題 | No.3 ビットすごろく | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2020-08-20 22:23:06 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 125 ms / 5,000 ms | 
| コード長 | 1,091 bytes | 
| コンパイル時間 | 169 ms | 
| コンパイル使用メモリ | 82,536 KB | 
| 実行使用メモリ | 79,492 KB | 
| 最終ジャッジ日時 | 2024-07-01 09:53:43 | 
| 合計ジャッジ時間 | 4,132 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 33 | 
ソースコード
import heapq
#edgeには[weight,v]を追加していく
def dijkstra(s,edge):
    #始点sから各頂点への最短距離
    d = [float("inf")] * (n+1)
    used = [True] * (n+1) #True:未確定
    d[s] = 0
    used[s] = False
    edgelist = []
    for e in edge[s]:
        heapq.heappush(edgelist,e)
    while len(edgelist):
        minedge = heapq.heappop(edgelist)
        #まだ使われてない頂点の中から最小の距離のものを探す
        if not used[minedge[1]]:
            continue
        v = minedge[1]
        d[v] = minedge[0]
        used[v] = False
        for e in edge[v]:
            if used[e[1]]:
                heapq.heappush(edgelist,[e[0]+d[v],e[1]])
    return d
def popcount(n):
    ret=0
    for i in range(20):
        if n&(1<<i):
            ret+=1
    return ret
n=int(input())
edges=[[] for _ in range(n+1)]
for v in range(1,n+1):
    pc=popcount(v)
    if v-pc>=1:
        edges[v].append((1,v-pc))
    if v+pc<=n:
        edges[v].append((1,v+pc))
ans=dijkstra(1,edges)
if ans[n]==float('inf'):
    print(-1)
else:
    print(ans[n]+1)
            
            
            
        