結果
| 問題 |
No.199 星を描こう
|
| コンテスト | |
| ユーザー |
kenkoooo
|
| 提出日時 | 2015-04-29 00:11:18 |
| 言語 | Java (openjdk 23) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,876 bytes |
| コンパイル時間 | 2,445 ms |
| コンパイル使用メモリ | 78,872 KB |
| 実行使用メモリ | 54,488 KB |
| 最終ジャッジ日時 | 2024-12-30 03:21:06 |
| 合計ジャッジ時間 | 7,922 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 24 WA * 1 |
ソースコード
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];
}
}
kenkoooo