結果
問題 | No.496 ワープクリスタル (給料日前編) |
ユーザー | jousen |
提出日時 | 2017-03-25 00:43:08 |
言語 | Java21 (openjdk 21) |
結果 |
WA
|
実行時間 | - |
コード長 | 9,391 bytes |
コンパイル時間 | 2,222 ms |
コンパイル使用メモリ | 91,232 KB |
実行使用メモリ | 41,872 KB |
最終ジャッジ日時 | 2024-07-06 03:20:16 |
合計ジャッジ時間 | 6,335 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 106 ms
41,320 KB |
testcase_01 | AC | 96 ms
40,444 KB |
testcase_02 | AC | 96 ms
40,428 KB |
testcase_03 | AC | 108 ms
40,748 KB |
testcase_04 | WA | - |
testcase_05 | AC | 94 ms
39,828 KB |
testcase_06 | AC | 105 ms
41,100 KB |
testcase_07 | AC | 97 ms
40,228 KB |
testcase_08 | AC | 117 ms
40,984 KB |
testcase_09 | AC | 118 ms
41,616 KB |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | AC | 102 ms
40,488 KB |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | WA | - |
testcase_23 | WA | - |
testcase_24 | WA | - |
testcase_25 | WA | - |
testcase_26 | WA | - |
ソースコード
package main; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Scanner; public class Main { private static int[] arr; private int[][] ar2; private List<Integer> list; public static int n,m,k; private static HashSet<Integer> set; private static HashMap<Integer, Integer> map; private static Scanner sc = new Scanner(System.in); private static List<List<Integer>> ll; private static List<HashSet<Integer>> hList; public static void main(String[] args){ //n = sc.nextInt(); //arr = new int[n]; int Gx = sc.nextInt(); int Gy = sc.nextInt(); n = sc.nextInt(); int F = sc.nextInt(); Tupple[][] dp = new Tupple[n+1][n+1]; for(int i=0 ; i<n+1; i++)dp[i ] = new Tupple[n+1]; Crystal[] stone = new Crystal[n]; //List<HashMap<Integer, Tupple>>edge = new ArrayList<HashMap<Integer,Tupple>>(); //for(int i=0; i<=n; i++)edge[i] = new ArrayList()<HashMap<Integer, Tupple>>() ; for(int i=0; i<n; i++){ int x = sc.nextInt(); int y = sc.nextInt(); int c = sc.nextInt(); stone[i] = new Crystal(x,y,c); } boolean[] ch = new boolean[n]; Arrays.sort(stone,(a,b)->((a.x+a.y)/a.c)-((b.x+b.y)/b.c)); for(int i=0; i<n; i++){ int dis = stone[i].x+stone[i].y; int cos = stone[i].c; if(dis*F<=cos)ch[i] = true; } int row= 0; int col = 0; int sum =0; for(int i=0; i<n; i++){ if(ch[i])continue; int nx = row+stone[i].x; int ny = col+stone[i].y; if(nx<=Gx && ny <=Gy){ row = nx; col = ny; sum +=stone[i].c; } } System.out.println(calc(row, col, sum, Gx, Gy, F)); // for(int i=0; i<n; i++){ // if(ch[i])continue; // for(int j=i+1; j<n; j++){ // if(ch[j])continue; // // } //} // int [] memo = new int[3]; // for(int i=0; i<1<<n; i++){ // int x = 0; // int y = 0; // int cost = 0; // for(int j=0; j<n; j++){ // if(((i>>j)&1) == 1){ // x += stone[j].x; // y += stone[j].y; // cost += stone[j].c; // } // } // if(x>Gx || y>Gy)continue; // //int dis = Math.abs(Gx-x)+Math.abs(Gy-y); // //int com = Math.abs(memo[0]-x)+Math.abs(memo[1]-y); // int dis = calc(x, y, cost, Gx, Gy, F); // int com = calc(memo[0], memo[1], memo[2], Gx, Gy, F); // if(dis<com){ // memo[0] = x; // memo[1] = y; // memo[2] = cost; // } // } // // System.out.println(calc(memo[0], memo[1], memo[2], Gx, Gy, F)); } public static int calc(int x, int y ,int c, int gx, int gy, int f) { int sum = c; sum += Math.abs(gx-x)*f; sum += Math.abs(gy-y)*f; return sum; } public static int dfs(int sum , int i, int x, int y, Crystal[] stone, int gx, int gy, int f) { if(x>gx || y>gy)return Integer.MAX_VALUE; return sum; } } class Crystal{ int x,y,c; public Crystal(int a, int b, int c){ this.x = a; this.y = b; this.c = c; } } class array2D{ public int[][] arr; public array2D(int row, int col) { arr = new int[row][col]; for(int i=0; i<row; i++){ arr[i] = new int[col]; for(int j=0; j<col; j++){ arr[i][j ]=0; } } } } class Tupple{ int a=0, b=0; public Tupple(int x, int y) { // TODO 自動生成されたコンストラクター・スタブ this.a = x; this.b = y; } public int first() { return this.a; } public int second() { return this.b; } } class sqrtArr{ public int[] arr; public int n; public sqrtArr(int x , int[] original) { this.n = (int)Math.sqrt(x)+1; arr = new int[n]; for(int i=0; i<x; i++){ arr[i/n] += original[i]; } } public int get(int l , int r) { int sum =0; for(int i=l; i<=r;){ if(i% n==0 && i+n-1 <=r){ sum += arr[i/n]; i += n; } else { sum +=arr[i]; i++; } } return sum; } } class UnionFind{ public int[] path; public int[] size; public List<HashSet<Integer>> list; public UnionFind (int n, int[] original) { path = new int[n+1]; size = new int[n+1]; list = new ArrayList<HashSet<Integer>>(); for(int i=0; i<n; i++){ path[i] = i; size[i] =1; list.add(new HashSet<Integer>()); list.get(i).add(original[i]); } } public int root(int i){ while (path[i] != i) { path[i] = path[path[path[i]]]; i = path[i]; } return i; } public boolean find(int p, int q) { if(p<0 || q<0)return false; return root(p) == root(q); } public void uniite(int p, int q) { if(p<0 || q<0)return; int i = root(p); int j = root(q); if(i==j)return; if(size[i]>size[j]){ // int tmp = i;l // i=j; // j = tmp; i^=j^=i^=j; } size[j ] += size[i]; path[i] = j; } } class BIT{ int n; private int[] bit = new int[100010]; public BIT(int x , int[] original){ this.n = x; for(int i=1; i<=n; i++){ //bit[i] = original[i]; add(i, original[i]); } } public void add(int a, int w) { for(int i = a; i<=n; i+= i&(-i))bit[i] +=w; } public int sum(int a) { int sum = 0; for(int i=a;i>0; i-=i&(-i)) sum+=bit[i]; return sum; } public int binary(int w){ if(w<=0)return 0; int x =0; for(int k = n%2==0? n:n-1; k>0; k/=2){ if(x+k<=n && bit[x+k]<w){ w -=bit[x+k]; x += k; } } return x+1; } } class Segment{ int n; int size ; private int[] dat; //private HashSet<Integer>[] dat; public Segment(int x) { this.n = x; this.size = x*2; dat = new int[size]; //dat = new HashSet<Integer>[size]; for(int i=0; i<size;i++){ dat[i] = Integer.MAX_VALUE; //dat[i ] = new HashSet<>(); } } public void update(int i, int x) { i = n+i-1; dat[i ] = x; while (i>0) { i =(i-1)/2; dat[i] = Math.min(dat[i*2+1], dat[i*2+2]); } } int query(int a, int b, int k, int l, int r){ if(r<=a || b<=l)return Integer.MAX_VALUE; if(a<=l && r<=b)return dat[k]; else { int vl = query(a, b, k*2+1, l, (l+r)/2); int vr = query(a, b, k*2+2, (l+r)/2, r); return Math.min(vl, vr); } } } class Tree{ int n,l ; private int[][] g; private int[] tin,tout; int timer; private int[][] up; public Tree(int n){ this.n = n; tin = new int[n+1]; tout = new int[n+1]; timer = 0; g= new int[n+1][l]; up = new int[n+1][l]; l = 1; while ((1 << l) <= n) ++ l; //for (int i = 0; i <n; ++ i) up [i] = new int[l+1]; for(int i=0; i<=n; i++){ g[i] = new int[l+1]; up[i]= new int[l+1]; } } void dfs (int v, int p) { tin [v] = ++ timer; up [v] [0] = p; for (int i = 1; i <= l; ++ i) up [v] [i] = up [up [v] [i-1]] [i-1]; for (int i = 0; i <g [v].length; ++ i) { int to = g [v] [i]; if (to!= p) dfs (to, v); } tout [v] = ++ timer; } boolean upper (int a, int b) { return tin [a] <= tin [b] && tout [a]>= tout [b]; } int lca (int a, int b) { if (upper (a, b)) return a; if (upper (b, a)) return b; for (int i = l; i>= 0; --i) if (! upper (up [a] [i], b)) a = up [a] [i]; return up [a] [0]; } } //class Tree{ // int n,l ; // private int[][] g; // private int[] tin,tout; // int timer; // private int[][] up; // private int[] parent ; // // public Tree(int n){ // this.n = n; // this.l = (int)Math.pow(2,n); // tin = new int[n+1]; // tout = new int[n+1]; // timer = 0; // parent = new int[n+1]; // g= new int[n+1][n+1]; // up = new int[n+1][n+1]; // for(int i=0; i<=n; i++){ // g[i] = new int[n+1]; // up[i]= new int[n+1]; // } // } // // void preprocess(){ // //Every element in P[][] is -1 initially; // for(int i = 1 ; i <= n ; ++i){ // for(int j = 0 ; (1<<j) < n ; ++i){ // g[i][j] = -1; // } // } // // //The first ancestor(2^0 th ancestor) // //for every node is parent[node] // for(int i = 1 ; i <= n ; ++i){ // g[i][0] = parent[i] ; // } // // for(int j = 1; (1<<j) < n ; ++j){ // for(int i = 1 ; i <= n ; ++i){ // //If a node does not have a (2^(j-1))th ancestor // //Then it does not have a (2^j)th ancestor // //and hence P[i][j] should remain -1 // //Else the (2^j)th ancestor of node i // //is the (2^(j-1))th ancestor of ((2^(j-1))th ancestor of node i) // if(g[i][j-1] != -1){ // g[i][j] = g[g[i][j-1]][j-1] ; // } // } // } // } // int LCA(int u , int v){ // if(level[u] < level[v]){ // swap(u,v) ; // } // //u is the node at a greater depth/lower level // //So we have to raise u to be at the same // //level as v. // int dist = level[u] - level[v] ; // while(dist > 0){ // int raise_by = log2(dist); // u = P[u][raise_by]; // dist -= (1<<raise_by) ; // } // // if(u == v){ // return u ; // } // // //Now we keep raising the two nodes by equal amount // //Untill each node has been raised uptill its (k-1)th ancestor // //Such that the (k)th ancestor is the lca. // //So to get the lca we just return the parent of (k-1)th ancestor // //of each node // // for(int j = MAXLOG ; j >= 0 ; --j){ // //Checking P[u][j] != P[v][j] because if P[u][j] == P[v][j] // //P[u][j] would be the Lth ancestor such that (L >= k) // //where kth ancestor is the LCA // //But we want the (k-1)th ancestor. // if((P[u][j] != -1) and (P[u][j] != P[v][j])){ // u = P[u][j] ; // v = P[v][j] ; // } // } // return parent[u] ; //or parent[v] // } //}