結果
問題 | No.20 砂漠のオアシス |
ユーザー | リチウム |
提出日時 | 2014-11-16 18:15:34 |
言語 | Java21 (openjdk 21) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,148 bytes |
コンパイル時間 | 2,534 ms |
コンパイル使用メモリ | 80,456 KB |
実行使用メモリ | 67,472 KB |
最終ジャッジ日時 | 2024-10-13 04:58:46 |
合計ジャッジ時間 | 10,067 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 136 ms
53,744 KB |
testcase_01 | WA | - |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | AC | 223 ms
56,652 KB |
testcase_05 | AC | 516 ms
65,664 KB |
testcase_06 | AC | 571 ms
67,264 KB |
testcase_07 | AC | 576 ms
67,332 KB |
testcase_08 | AC | 582 ms
67,292 KB |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | AC | 137 ms
54,184 KB |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | AC | 237 ms
57,544 KB |
testcase_15 | AC | 229 ms
57,504 KB |
testcase_16 | AC | 282 ms
58,468 KB |
testcase_17 | WA | - |
testcase_18 | AC | 272 ms
58,764 KB |
testcase_19 | WA | - |
testcase_20 | AC | 203 ms
56,640 KB |
ソースコード
import java.util.*; public class Main { public static int[] dijstra(ArrayList<Integer> e[], ArrayList<Integer> c[], int start) { PriorityQueue<Edge> dij = new PriorityQueue<>(); int ans[] = new int[e.length]; boolean ok[] = new boolean[e.length]; Arrays.fill(ans, Integer.MAX_VALUE); ans[start] = 0; ok[start] = true; dij.add(new Edge(start, 0)); while (!dij.isEmpty()) { Edge ed = dij.poll(); if (ans[ed.p] < ed.c) continue; int a = ed.p; ok[a] = true; for (int i = 0; i < e[a].size(); i++) { int x = e[a].get(i); int y = c[a].get(i); if (!ok[x] && ans[x] > ans[a] + y) { ans[x] = ans[a] + y; dij.add(new Edge(x, ans[x])); } } } return ans; } public static void main(String[] args) { Scanner sc=new Scanner (System.in); int n=sc.nextInt(); int hp=sc.nextInt(); int map[][]=new int[n][n]; int ox=sc.nextInt()-1; int oy=sc.nextInt()-1; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ map[i][j]=sc.nextInt(); } } ArrayList <Integer>e[]=new ArrayList[n*n]; ArrayList <Integer>c[]=new ArrayList[n*n]; for(int i=0;i<n*n;i++){ e[i]=new ArrayList<>(); c[i]=new ArrayList<>(); } for(int i=0;i<n*n;i++){ int x=i/n; int y=i-x*n; int dx[]={1,-1,0,0}; int dy[]={0,0,1,-1}; for(int j=0;j<4;j++){ int nx=x+dx[j]; int ny=y+dy[j]; if(nx<0 || nx>=n || ny<0 || ny>=n)continue; e[i].add(nx*n+ny); c[i].add(map[nx][ny]); } } int dij[]=dijstra(e,c,0); int g=(n-1)*(n-1); if(dij[g]<hp){ System.out.println("YES"); return; } if(ox!=-1){ int oa=ox*n+oy; dij=dijstra(e,c,0); hp-=dij[oa]; hp*=2; dij=dijstra(e,c,oa); if(hp>dij[g]){ System.out.println("YES"); return; } } System.out.println("NO"); } } class Edge implements Comparable<Edge> {//scacheさんから拝借 int p; int c; public Edge(int p, int c) { this.p = p; this.c = c; } public Edge() { } @Override public int compareTo(Edge o) { return this.c - o.c; } }