結果
問題 | No.168 ものさし |
ユーザー |
![]() |
提出日時 | 2015-09-15 00:28:06 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 265 ms / 2,000 ms |
コード長 | 2,250 bytes |
コンパイル時間 | 2,471 ms |
コンパイル使用メモリ | 78,940 KB |
実行使用メモリ | 45,296 KB |
最終ジャッジ日時 | 2024-12-24 07:11:36 |
合計ジャッジ時間 | 7,888 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 19 |
ソースコード
import java.util.Arrays;import java.util.HashSet;import java.util.LinkedList;import java.util.PriorityQueue;import java.util.Scanner;import java.util.Set;public class Main {public static class Node implements Comparable<Node> {int node;long max_dist;public Node(int node, long max_dist){this.node = node;this.max_dist = max_dist;}@Overridepublic int compareTo(Node o) {return Long.compare(this.max_dist, o.max_dist);}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);final int N = sc.nextInt();long[] xs = new long[N];long[] ys = new long[N];for(int i = 0; i < N; i++){xs[i] = sc.nextLong();ys[i] = sc.nextLong();}long[] dists = new long[N];Arrays.fill(dists, Long.MAX_VALUE);PriorityQueue<Node> queue = new PriorityQueue<Node>();queue.add(new Node(0, 0));while(!queue.isEmpty()){final Node node = queue.poll();if(dists[node.node] < node.max_dist){continue;}else{dists[node.node] = node.max_dist;}if(node.node == N - 1){long lower = 0, upper = Integer.MAX_VALUE;while(lower + 1 < upper){final long mid = (lower + upper) / 2;final long mid_val = mid * mid;//System.out.println(upper + " " + lower + " " + mid_val);if(mid_val >= node.max_dist){upper = mid;}else{lower = mid;}}System.out.println((upper + 9) / 10 * 10);//System.out.println(node.max_dist);//System.out.println((int)(Math.floor(Math.sqrt(node.max_dist))));//System.out.println(((int)(Math.sqrt(node.max_dist)) + 9) / 10 * 10);break;}final long node_x = xs[node.node];final long node_y = ys[node.node];for(int next = 0; next < N; next++){if(node.node == next){ continue; }final long next_x = xs[next];final long next_y = ys[next];final long next_dist = (node_x - next_x) * (node_x - next_x) + (node_y - next_y) * (node_y - next_y);final long next_max = Math.max(next_dist, node.max_dist);if(dists[next] <= next_max){continue;}else{dists[next] = next_max;queue.add(new Node(next, next_max));}}}}}