結果
問題 | No.5018 Let's Make a Best-seller Book |
ユーザー | ks2m |
提出日時 | 2023-10-01 16:15:24 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 136 ms / 400 ms |
コード長 | 7,340 bytes |
コンパイル時間 | 2,755 ms |
コンパイル使用メモリ | 85,692 KB |
実行使用メモリ | 68,656 KB |
スコア | 111,242 |
平均クエリ数 | 52.00 |
最終ジャッジ日時 | 2023-10-01 16:15:46 |
合計ジャッジ時間 | 20,282 ms |
ジャッジサーバーID (参考情報) |
judge12 / judge13 |
純コード判定しない問題か言語 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 131 ms
68,304 KB |
testcase_01 | AC | 117 ms
66,976 KB |
testcase_02 | AC | 122 ms
65,548 KB |
testcase_03 | AC | 124 ms
67,376 KB |
testcase_04 | AC | 131 ms
67,172 KB |
testcase_05 | AC | 116 ms
67,084 KB |
testcase_06 | AC | 126 ms
65,036 KB |
testcase_07 | AC | 116 ms
68,508 KB |
testcase_08 | AC | 115 ms
67,428 KB |
testcase_09 | AC | 126 ms
67,784 KB |
testcase_10 | AC | 127 ms
67,464 KB |
testcase_11 | AC | 125 ms
67,088 KB |
testcase_12 | AC | 132 ms
67,684 KB |
testcase_13 | AC | 129 ms
67,724 KB |
testcase_14 | AC | 116 ms
67,868 KB |
testcase_15 | AC | 118 ms
68,356 KB |
testcase_16 | AC | 116 ms
68,236 KB |
testcase_17 | AC | 114 ms
67,432 KB |
testcase_18 | AC | 117 ms
67,768 KB |
testcase_19 | AC | 133 ms
68,576 KB |
testcase_20 | AC | 122 ms
68,260 KB |
testcase_21 | AC | 126 ms
67,596 KB |
testcase_22 | AC | 127 ms
67,424 KB |
testcase_23 | AC | 118 ms
67,716 KB |
testcase_24 | AC | 116 ms
67,908 KB |
testcase_25 | AC | 123 ms
67,116 KB |
testcase_26 | AC | 127 ms
68,328 KB |
testcase_27 | AC | 125 ms
67,664 KB |
testcase_28 | AC | 125 ms
67,376 KB |
testcase_29 | AC | 117 ms
67,040 KB |
testcase_30 | AC | 121 ms
67,232 KB |
testcase_31 | AC | 116 ms
68,288 KB |
testcase_32 | AC | 117 ms
67,104 KB |
testcase_33 | AC | 119 ms
67,700 KB |
testcase_34 | AC | 124 ms
68,080 KB |
testcase_35 | AC | 115 ms
68,040 KB |
testcase_36 | AC | 121 ms
67,864 KB |
testcase_37 | AC | 125 ms
67,404 KB |
testcase_38 | AC | 117 ms
68,028 KB |
testcase_39 | AC | 116 ms
67,652 KB |
testcase_40 | AC | 126 ms
67,612 KB |
testcase_41 | AC | 133 ms
67,832 KB |
testcase_42 | AC | 116 ms
67,608 KB |
testcase_43 | AC | 118 ms
67,660 KB |
testcase_44 | AC | 126 ms
67,500 KB |
testcase_45 | AC | 115 ms
67,224 KB |
testcase_46 | AC | 114 ms
67,672 KB |
testcase_47 | AC | 125 ms
66,944 KB |
testcase_48 | AC | 125 ms
68,292 KB |
testcase_49 | AC | 122 ms
66,860 KB |
testcase_50 | AC | 124 ms
68,080 KB |
testcase_51 | AC | 118 ms
67,616 KB |
testcase_52 | AC | 116 ms
67,920 KB |
testcase_53 | AC | 115 ms
67,380 KB |
testcase_54 | AC | 124 ms
67,492 KB |
testcase_55 | AC | 126 ms
67,940 KB |
testcase_56 | AC | 130 ms
67,648 KB |
testcase_57 | AC | 125 ms
65,560 KB |
testcase_58 | AC | 127 ms
67,352 KB |
testcase_59 | AC | 113 ms
67,076 KB |
testcase_60 | AC | 118 ms
67,108 KB |
testcase_61 | AC | 125 ms
68,580 KB |
testcase_62 | AC | 124 ms
67,636 KB |
testcase_63 | AC | 121 ms
68,324 KB |
testcase_64 | AC | 125 ms
66,876 KB |
testcase_65 | AC | 116 ms
67,080 KB |
testcase_66 | AC | 127 ms
67,076 KB |
testcase_67 | AC | 115 ms
67,664 KB |
testcase_68 | AC | 124 ms
67,864 KB |
testcase_69 | AC | 116 ms
67,684 KB |
testcase_70 | AC | 116 ms
68,244 KB |
testcase_71 | AC | 136 ms
68,372 KB |
testcase_72 | AC | 119 ms
67,860 KB |
testcase_73 | AC | 128 ms
67,888 KB |
testcase_74 | AC | 117 ms
68,412 KB |
testcase_75 | AC | 126 ms
67,628 KB |
testcase_76 | AC | 126 ms
68,640 KB |
testcase_77 | AC | 114 ms
67,280 KB |
testcase_78 | AC | 118 ms
67,108 KB |
testcase_79 | AC | 128 ms
68,656 KB |
testcase_80 | AC | 116 ms
68,376 KB |
testcase_81 | AC | 128 ms
68,040 KB |
testcase_82 | AC | 117 ms
67,688 KB |
testcase_83 | AC | 118 ms
68,176 KB |
testcase_84 | AC | 117 ms
67,920 KB |
testcase_85 | AC | 114 ms
67,012 KB |
testcase_86 | AC | 133 ms
67,952 KB |
testcase_87 | AC | 115 ms
68,356 KB |
testcase_88 | AC | 132 ms
67,252 KB |
testcase_89 | AC | 113 ms
67,372 KB |
testcase_90 | AC | 121 ms
68,048 KB |
testcase_91 | AC | 116 ms
68,084 KB |
testcase_92 | AC | 115 ms
67,960 KB |
testcase_93 | AC | 124 ms
67,256 KB |
testcase_94 | AC | 122 ms
67,296 KB |
testcase_95 | AC | 127 ms
66,908 KB |
testcase_96 | AC | 123 ms
67,572 KB |
testcase_97 | AC | 122 ms
67,872 KB |
testcase_98 | AC | 114 ms
66,824 KB |
testcase_99 | AC | 117 ms
67,864 KB |
ソースコード
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.InputStreamReader; import java.util.Arrays; public class Main { static boolean batch = false; static boolean readFile = false; static boolean debug = false; static int caseNum = 9; static int T, N, T1; static long money = 2000000; static double[] D; static double[][] Z; static long[] mons; static int[][] s, p, r; public static void main(String[] args) throws Exception { if (batch) { readFile = true; } if (readFile) { if (batch) { long tl = 2000; // TODO long tw = tl - 200; long total = 0; int bidx = 0; int best = 0; int widx = 0; int worst = 1000000000; int re = 0; int tle = 0; for (int z = 0; z < 100; z++) { try { long st = System.currentTimeMillis(); int score = solve(z); long time = System.currentTimeMillis() - st; if (time > tw) { System.out.println(score + "\t" + time + "ms"); if (time > tl) { tle++; } } else { System.out.println(score); } total += score; if (score > best) { best = score; bidx = z; } if (score < worst) { worst = score; widx = z; } } catch (Exception e) { System.out.println(z + ":\t" + e.getMessage()); re++; } } System.out.println("total: " + total); System.out.println("best: " + bidx + ": " + best); System.out.println("worst: " + widx + ": " + worst); System.out.println("RE: " + re); System.out.println("TLE: " + tle); } else { int score = solve(caseNum); System.out.println(score); } } else { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); init(br); solve(br); br.close(); } } static int solve(int z) throws Exception { StringBuilder sb = new StringBuilder(); sb.append(z); while (sb.length() < 4) { sb.insert(0, '0'); } File file = new File("G:\\yuki\\007\\in\\seed_" + sb.toString() + ".txt"); BufferedReader br = new BufferedReader(new FileReader(file)); init(br); int res = solve(br); br.close(); return res; } static void init(BufferedReader br) throws Exception { String[] sa = br.readLine().split(" "); T = Integer.parseInt(sa[0]); N = Integer.parseInt(sa[1]); T1 = T + 1; if (readFile) { D = new double[N]; for (int i = 0; i < N; i++) { D[i] = Double.parseDouble(br.readLine()); } Z = new double[T][N]; for (int i = 0; i < T; i++) { sa = br.readLine().split(" "); for (int j = 0; j < N; j++) { Z[i][j] = Double.parseDouble(sa[j]); } } money = 2000000; } else { money = Integer.parseInt(sa[2]); } mons = new long[T1]; s = new int[T1][N]; p = new int[T1][N]; r = new int[T1][N]; mons[0] = money; } static int solve(BufferedReader br) throws Exception { double[] d = new double[N]; Arrays.fill(d, 1); for (int t = 1; t <= T; t++) { mons[t] = mons[t - 1]; for (int i = 0; i < N; i++) { s[t][i] = s[t - 1][i]; p[t][i] = p[t - 1][i]; r[t][i] = r[t - 1][i]; } if (debug) { System.out.println(Arrays.toString(s[t])); System.out.println(t); System.out.println(mons[t]); System.out.println(Arrays.toString(p[t])); System.out.println(Arrays.toString(r[t])); } boolean done = false; int pmax = 0; for (int i = 0; i < N; i++) { pmax = Math.max(pmax, p[t][i]); } if (pmax < 50 || pmax < 55 && mons[t] >= 8010000) { int x = 0; int need = 500000; for (int i = 1; i <= 5; i++) { if (mons[t] >= need + 10000) { x = i; } else { break; } need *= 2; } if (x >= 2) { output2(x, t); done = true; } } int[] l = new int[N]; double[] exp = new double[N]; double[] pow = new double[N]; for (int i = 0; i < N; i++) { pow[i] = Math.pow(1.05, p[t][i]); } if (!done) { double dsum = 0; for (int i = 0; i < N; i++) { dsum += d[i] * d[i]; } long can = mons[t] / 500; for (int i = 0; i < N; i++) { if (t >= 33) { l[i] = (int) (can * d[i] * d[i] / dsum); } else if (r[t][i] == 0 || Math.sqrt(r[t][i]) * pow[i] > ((int) (r[t][i] * 0.3) + 1) * 1.18) { int end = (int) (can * d[i] * d[i] / dsum); int ng = 0; for (int j = 1; j <= end; j++) { int v1 = r[t][i] + j; double v2 = Math.sqrt(v1) * pow[i] * d[i]; int v3 = (int) (v1 * 0.3) + 1; if (v2 > v3 * 1.18) { ng = 0; l[i] = j; } else { ng++; if (ng == 20) { break; } } } } } output1(l, t); done = true; } for (int i = 0; i < N; i++) { exp[i] = Math.sqrt(r[t][i]) * pow[i]; } boolean res = input(br, t); if (!res) { return -1; } for (int i = 0; i < N; i++) { if (s[t][i] > 0) { double dt = s[t][i] / exp[i]; if (d[i] == 1) { d[i] = dt; } else { d[i] = (d[i] * (t - 1) + dt) / t; } } } } int score = score(); return score; } static void output1(int[] l, int t) { int sum = 0; for (int i = 0; i < N; i++) { sum += l[i]; r[t][i] += l[i]; } if (readFile) { if (sum * 500 > money) { StringBuilder sb = new StringBuilder(); sb.append("money:").append(money); sb.append(" sum:").append(sum); throw new RuntimeException(sb.toString()); } } else { StringBuilder sb = new StringBuilder(); sb.append(1); for (int i = 0; i < N; i++) { sb.append(' ').append(l[i]); } System.out.println(sb.toString()); } money -= sum; } static void output2(int x, int t) { int val = 500000; for (int i = 1; i < x; i++) { val *= 2; } for (int i = 0; i < N; i++) { p[t][i] += x; if (p[t][i] > 60) { p[t][i] = 60; } } if (readFile) { if (val > money) { StringBuilder sb = new StringBuilder(); sb.append("money:").append(money); sb.append(" val:").append(val); throw new RuntimeException(sb.toString()); } } else { System.out.println("2 " + x); } money -= val; } static boolean input(BufferedReader br, int t) throws Exception { if (readFile) { for (int i = 0; i < N; i++) { double v1 = Math.sqrt(r[t][i]) * Math.pow(1.05, p[t][i]); double v2 = v1 * D[i]; double v3 = v2 * Z[t - 1][i]; int v4 = (int) Math.min(r[t][i], v3); s[t][i] = v4; if (r[t][i] != 0) { if (p[t][i] < 60 && v4 >= r[t][i] * 0.3) { p[t][i]++; } if (p[t][i] > -60 && v4 < r[t][i] * 0.1) { p[t][i]--; } } r[t][i] -= v4; money += 1000 * v4; } mons[t] = money; } else { mons[t] = Integer.parseInt(br.readLine()); if (mons[t] == -1) { return false; } String[] sa = br.readLine().split(" "); for (int i = 0; i < N; i++) { s[t][i] = Integer.parseInt(sa[i]); } sa = br.readLine().split(" "); for (int i = 0; i < N; i++) { p[t][i] = Integer.parseInt(sa[i]); } sa = br.readLine().split(" "); for (int i = 0; i < N; i++) { r[t][i] = Integer.parseInt(sa[i]); } } return true; } static int score() { int ret = 0; for (int t = 1; t <= T; t++) { for (int i = 0; i < N; i++) { ret += s[t][i]; } } ret = (ret + 99) / 100; return ret; } }