public class TheSimpleGame { public int count(int n, int[] x, int[] y) { int a = (n+1)/2; int b = 0; for(int i = 0; i < x.length; i++) { b += (x[i] <= a) ? x[i] - 1 : n - x[i]; b += (y[i] <= a) ? y[i] - 1 : n - y[i]; } return b; } }簡単。
600
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; public class TheTower { public int[] count(int[] x, int[] y) { int[] a = new int[x.length]; a[0] = 0; if(x.length == 1) { return a; } ArrayList<Integer> xList = new ArrayList<Integer>(); ArrayList<Integer> yList = new ArrayList<Integer>(); for(int i = 0; i < x.length; i++) { boolean flag1 = false; boolean flag2 = false; for(int j = 0; j < xList.size(); j++) { if(x[i] == xList.get(j)) { flag1 = true; break; } } if(!flag1) { xList.add(x[i]); } for(int j = 0; j < yList.size(); j++) { if(y[i] == yList.get(j)) { flag2 = true; break; } } if(!flag2) { yList.add(y[i]); } } for(int i = 1; i < x.length; i++) { ArrayList<Integer> list = new ArrayList<Integer>(); for(int j = 0; j < xList.size(); j++) { for(int k = 0; k < yList.size(); k++) { list.add(checkCell(xList.get(j), yList.get(k), i+1, x, y)); } } Collections.sort(list); a[i] = list.get(0); } return a; } private int checkCell(int x, int y, int n, int[] arrayX, int[] arrayY) { int[] array = new int[arrayX.length]; for(int i = 0; i < array.length; i++) { array[i] = (int)Math.abs((double)(x - arrayX[i])) + (int)Math.abs((double)(y - arrayY[i])); } Arrays.sort(array); int move = 0; for(int i = 0; i < n; i++) { move += array[i]; } return move; } }間違えたので後で修正した解答。
問題文は読めても結構難しい問題だと思う。これが600か。
おそらく、移動先のx,yはそれぞれのメジアン(中央値)になる。(ただしチェッカーが偶数のときは中央2つの平均ではなく、その2つのどちらかになる
そう考えると、x座標のリストと、y座標のリストの組み合わせ分だけ考慮すればいいので、その中で一番移動数が少ないものを選ぶ。
0 件のコメント:
コメントを投稿