結果
| 問題 |
No.20 砂漠のオアシス
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2014-11-16 18:21:03 |
| 言語 | Java (openjdk 23) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,142 bytes |
| コンパイル時間 | 2,216 ms |
| コンパイル使用メモリ | 80,320 KB |
| 実行使用メモリ | 57,668 KB |
| 最終ジャッジ日時 | 2024-10-13 04:58:56 |
| 合計ジャッジ時間 | 9,403 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 16 WA * 5 |
ソースコード
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*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;
}
}