結果
| 問題 | No.3 ビットすごろく |
| コンテスト | |
| ユーザー |
crazybbb3
|
| 提出日時 | 2016-11-27 12:25:57 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 100 ms / 5,000 ms |
| コード長 | 3,712 bytes |
| コンパイル時間 | 2,455 ms |
| コンパイル使用メモリ | 79,752 KB |
| 実行使用メモリ | 40,832 KB |
| 最終ジャッジ日時 | 2024-07-01 08:10:49 |
| 合計ジャッジ時間 | 5,971 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 33 |
ソースコード
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static BufferedReader in;
static PrintWriter out;
static StringTokenizer tok;
void solve() throws IOException {
int n = ni();
ArrayList<ArrayList<Edge>> G = new ArrayList<>();
for (int i = 0; i < n + 1; i++) {
G.add(new ArrayList<>());
}
for (int i = 1; i <= n; i++) {
int bitNum = Integer.bitCount(i);
if (i - bitNum >= 1) {
G.get(i).add(new Edge(i - bitNum, 1));
}
if (i + bitNum <= n) {
G.get(i).add(new Edge(i + bitNum, 1));
}
}
Dijkstra d = new Dijkstra(G);
int[] dist = d.getDist(1);
int INF = Integer.MAX_VALUE / 3;
out.println(dist[n] == INF ? -1 : dist[n] + 1);
}
class Dijkstra {
int n;
ArrayList<ArrayList<Edge>> G;
int INF = Integer.MAX_VALUE / 3;
public Dijkstra(ArrayList<ArrayList<Edge>> G) {
n = G.size();
this.G = G;
}
int[] getDist(int s) {
PriorityQueue<Pair> Q = new PriorityQueue<>();
Q.add(new Pair(s, 0));
int[] dist = new int[n];
Arrays.fill(dist, INF);
boolean[] used = new boolean[n];
while (!Q.isEmpty()) {
Pair p = Q.poll();
if (used[p.x]) continue;
used[p.x] = true;
dist[p.x] = p.y;
for (Edge e : G.get(p.x)) {
Q.add(new Pair(e.to, p.y + e.cost));
}
}
return dist;
}
public class Pair implements Comparable<Pair> {
int x, y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
public int compareTo(Pair p) {
return y - p.y;
}
}
}
class Edge implements Comparable<Edge> {
int to;
int cost;
public Edge(int to, int cost) {
this.to = to;
this.cost = cost;
}
public int compareTo(Edge edge) {
return cost - edge.cost;
}
}
String ns() throws IOException {
while (!tok.hasMoreTokens()) {
tok = new StringTokenizer(in.readLine(), " ");
}
return tok.nextToken();
}
int ni() throws IOException {
return Integer.parseInt(ns());
}
long nl() throws IOException {
return Long.parseLong(ns());
}
double nd() throws IOException {
return Double.parseDouble(ns());
}
String[] nsa(int n) throws IOException {
String[] res = new String[n];
for (int i = 0; i < n; i++) {
res[i] = ns();
}
return res;
}
int[] nia(int n) throws IOException {
int[] res = new int[n];
for (int i = 0; i < n; i++) {
res[i] = ni();
}
return res;
}
long[] nla(int n) throws IOException {
long[] res = new long[n];
for (int i = 0; i < n; i++) {
res[i] = nl();
}
return res;
}
public static void main(String[] args) throws IOException {
in = new BufferedReader(new InputStreamReader(System.in));
out = new PrintWriter(System.out);
tok = new StringTokenizer("");
Main main = new Main();
main.solve();
out.close();
}
}
crazybbb3