結果
| 問題 |
No.8024 等式
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-03-31 23:43:34 |
| 言語 | Java (openjdk 23) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,226 bytes |
| コンパイル時間 | 2,649 ms |
| コンパイル使用メモリ | 87,700 KB |
| 実行使用メモリ | 67,196 KB |
| 最終ジャッジ日時 | 2024-07-08 05:37:51 |
| 合計ジャッジ時間 | 15,812 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 22 TLE * 1 |
ソースコード
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
new Main().run();
}
ArrayList<Double>[][] dp;
// [left,right]
ArrayList<Double> rec(int left, int right, int[] A, int[] ord) {
if (dp[left][right].size() != 0) {
return dp[left][right];
}
if (right - left == 0) {
dp[left][right].add((double) A[ord[left]]);
return dp[left][right];
}
ArrayList<Double> ret = new ArrayList<>();
for (int i = left; i < right; ++i) {
ArrayList<Double> lv = rec(left, i, A, ord);
ArrayList<Double> rv = rec(i + 1, right, A, ord);
for (double v1 : lv) {
for (double v2 : rv) {
ret.add(v1 + v2);
ret.add(v1 - v2);
if (Math.abs(v1 + v2) < 1e-6 || Math.abs(v1 - v2) < 1e-6) {
System.out.println("YES");
System.exit(0);
}
if (v2 != 0) {
ret.add(v1 / v2);
}
ret.add(v1 * v2);
}
}
}
dp[left][right] = ret;
return ret;
}
void run() {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] A = new int[N];
for (int i = 0; i < N; ++i) {
A[i] = sc.nextInt();
}
int[] ord = new int[N];
for (int i = 0; i < ord.length; ++i) {
ord[i] = i;
}
// permutationの状態数は5040通り。
do {
dp = new ArrayList[N][N];
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
dp[i][j] = new ArrayList<>();
}
}
ArrayList<Double> tmp = rec(0, N - 1, A, ord);
if (Math.abs(tmp.get(0)) < 1e-6) {
System.out.println("YES");
return;
}
} while (nextPermutation(ord));
System.out.println("NO");
}
boolean nextPermutation(int[] ord) {
int n = ord.length;
int i = n - 1;
while (i - 1 >= 0 && ord[i - 1] > ord[i]) {
--i;
}
if (i == 0)
return false;
int j = i;
while (j + 1 < n && ord[i - 1] < ord[j + 1]) {
++j;
}
int tmp = ord[i - 1];
ord[i - 1] = ord[j];
ord[j] = tmp;
int s = i;
int t = n - 1;
while (t - s > 0) {
tmp = ord[t];
ord[t] = ord[s];
ord[s] = tmp;
++s;
--t;
}
return true;
}
void tr(Object... objects) {
System.out.println(Arrays.deepToString(objects));
}
}