結果
問題 | No.199 星を描こう |
ユーザー | kenkoooo |
提出日時 | 2015-04-29 00:11:18 |
言語 | Java21 (openjdk 21) |
結果 |
WA
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,876 bytes |
コンパイル時間 | 6,669 ms |
コンパイル使用メモリ | 79,028 KB |
実行使用メモリ | 54,292 KB |
最終ジャッジ日時 | 2024-06-09 13:45:31 |
合計ジャッジ時間 | 6,946 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 97 ms
52,520 KB |
testcase_01 | AC | 119 ms
53,984 KB |
testcase_02 | AC | 109 ms
53,028 KB |
testcase_03 | AC | 113 ms
54,044 KB |
testcase_04 | AC | 118 ms
53,864 KB |
testcase_05 | AC | 116 ms
54,012 KB |
testcase_06 | AC | 104 ms
53,284 KB |
testcase_07 | AC | 111 ms
52,800 KB |
testcase_08 | AC | 110 ms
53,696 KB |
testcase_09 | AC | 120 ms
53,844 KB |
testcase_10 | AC | 115 ms
53,944 KB |
testcase_11 | AC | 99 ms
52,664 KB |
testcase_12 | AC | 116 ms
54,292 KB |
testcase_13 | AC | 114 ms
53,836 KB |
testcase_14 | AC | 96 ms
52,516 KB |
testcase_15 | WA | - |
testcase_16 | AC | 113 ms
54,000 KB |
testcase_17 | AC | 119 ms
53,936 KB |
testcase_18 | AC | 118 ms
54,036 KB |
testcase_19 | AC | 117 ms
53,860 KB |
testcase_20 | AC | 103 ms
52,712 KB |
testcase_21 | AC | 109 ms
53,644 KB |
testcase_22 | AC | 105 ms
53,932 KB |
testcase_23 | AC | 111 ms
54,284 KB |
testcase_24 | AC | 101 ms
52,852 KB |
testcase_25 | AC | 118 ms
53,016 KB |
testcase_26 | AC | 117 ms
54,020 KB |
testcase_27 | AC | 109 ms
53,072 KB |
ソースコード
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] x = new int[5]; int[] y = new int[5]; for (int i = 0; i < 5; i++) { x[i] = sc.nextInt(); y[i] = sc.nextInt(); } int N = x.length; ArrayList<Integer> list = new ArrayList<>(); int start = 0; // x座標のもっとも大きい点を始点にする for (int i = 1; i < N; i++) { if (x[start] < x[i]) start = i; } boolean[] used = new boolean[N]; used[start] = true; list.add(start); // Y軸の正の向きの単位ベクトル double[] prevDir = new double[2]; prevDir[0] = 0.0; prevDir[1] = 1.0; while (true) { int from = list.get(list.size() - 1); double max = -20000000.0; int next = -1; for (int to = 0; to < N; to++) { // 前のベクトルに対して最も内積が大きくなるように次の点を探す // そうすると、曲がり角を最大にすることが出来る double[] toDir = direction(x, y, from, to); double pro = product(prevDir, toDir); if (max == pro) { System.out.println("NO"); return; } if (max < pro) { max = pro; next = to; } } prevDir = direction(x, y, from, next); list.add(next); if (used[next]) { break; } used[next] = true; } if (list.size() == 6) { System.out.println("YES"); } else { System.out.println("NO"); } } static double[] direction(int[] X, int[] Y, int from, int to) { // fromからtoへの単位ベクトルを返す double dx = X[to] - X[from]; double dy = Y[to] - Y[from]; return new double[] { dx / Math.sqrt(dx * dx + dy * dy), dy / Math.sqrt(dx * dx + dy * dy) }; } static double product(double[] a, double[] b) { // ベクトル内積を返す return a[0] * b[0] + a[1] * b[1]; } }