結果
問題 | No.5018 Let's Make a Best-seller Book |
ユーザー | ks2m |
提出日時 | 2023-10-01 15:41:59 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 129 ms / 400 ms |
コード長 | 7,283 bytes |
コンパイル時間 | 2,727 ms |
コンパイル使用メモリ | 84,844 KB |
実行使用メモリ | 68,772 KB |
スコア | 28,810 |
平均クエリ数 | 52.00 |
最終ジャッジ日時 | 2023-10-01 15:42:19 |
合計ジャッジ時間 | 19,633 ms |
ジャッジサーバーID (参考情報) |
judge15 / judge12 |
純コード判定しない問題か言語 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 113 ms
68,300 KB |
testcase_01 | AC | 111 ms
68,460 KB |
testcase_02 | AC | 121 ms
68,372 KB |
testcase_03 | AC | 109 ms
67,032 KB |
testcase_04 | AC | 125 ms
68,360 KB |
testcase_05 | AC | 120 ms
68,088 KB |
testcase_06 | AC | 117 ms
67,840 KB |
testcase_07 | AC | 122 ms
68,640 KB |
testcase_08 | AC | 119 ms
67,636 KB |
testcase_09 | AC | 119 ms
67,088 KB |
testcase_10 | AC | 116 ms
67,260 KB |
testcase_11 | AC | 125 ms
67,624 KB |
testcase_12 | AC | 121 ms
67,584 KB |
testcase_13 | AC | 110 ms
67,532 KB |
testcase_14 | AC | 112 ms
65,488 KB |
testcase_15 | AC | 112 ms
67,368 KB |
testcase_16 | AC | 123 ms
68,000 KB |
testcase_17 | AC | 113 ms
67,364 KB |
testcase_18 | AC | 125 ms
66,356 KB |
testcase_19 | AC | 112 ms
68,400 KB |
testcase_20 | AC | 110 ms
65,544 KB |
testcase_21 | AC | 111 ms
68,556 KB |
testcase_22 | AC | 125 ms
67,280 KB |
testcase_23 | AC | 123 ms
67,676 KB |
testcase_24 | AC | 110 ms
67,620 KB |
testcase_25 | AC | 122 ms
68,388 KB |
testcase_26 | AC | 116 ms
66,152 KB |
testcase_27 | AC | 120 ms
67,564 KB |
testcase_28 | AC | 122 ms
67,012 KB |
testcase_29 | AC | 113 ms
68,056 KB |
testcase_30 | AC | 112 ms
68,604 KB |
testcase_31 | AC | 119 ms
68,160 KB |
testcase_32 | AC | 124 ms
67,972 KB |
testcase_33 | AC | 123 ms
68,008 KB |
testcase_34 | AC | 119 ms
67,984 KB |
testcase_35 | AC | 113 ms
66,608 KB |
testcase_36 | AC | 116 ms
67,796 KB |
testcase_37 | AC | 126 ms
67,704 KB |
testcase_38 | AC | 124 ms
68,184 KB |
testcase_39 | AC | 121 ms
67,504 KB |
testcase_40 | AC | 109 ms
67,420 KB |
testcase_41 | AC | 113 ms
67,400 KB |
testcase_42 | AC | 114 ms
67,296 KB |
testcase_43 | AC | 111 ms
67,724 KB |
testcase_44 | AC | 109 ms
67,848 KB |
testcase_45 | AC | 127 ms
67,656 KB |
testcase_46 | AC | 119 ms
68,772 KB |
testcase_47 | AC | 111 ms
68,472 KB |
testcase_48 | AC | 114 ms
65,804 KB |
testcase_49 | AC | 126 ms
67,160 KB |
testcase_50 | AC | 111 ms
68,076 KB |
testcase_51 | AC | 111 ms
68,760 KB |
testcase_52 | AC | 110 ms
67,500 KB |
testcase_53 | AC | 128 ms
66,948 KB |
testcase_54 | AC | 124 ms
67,624 KB |
testcase_55 | AC | 112 ms
67,888 KB |
testcase_56 | AC | 120 ms
67,648 KB |
testcase_57 | AC | 112 ms
67,656 KB |
testcase_58 | AC | 110 ms
67,408 KB |
testcase_59 | AC | 116 ms
66,988 KB |
testcase_60 | AC | 118 ms
66,944 KB |
testcase_61 | AC | 115 ms
67,572 KB |
testcase_62 | AC | 111 ms
67,424 KB |
testcase_63 | AC | 113 ms
68,084 KB |
testcase_64 | AC | 115 ms
67,888 KB |
testcase_65 | AC | 120 ms
67,888 KB |
testcase_66 | AC | 113 ms
67,012 KB |
testcase_67 | AC | 110 ms
67,828 KB |
testcase_68 | AC | 112 ms
66,484 KB |
testcase_69 | AC | 117 ms
67,368 KB |
testcase_70 | AC | 116 ms
68,144 KB |
testcase_71 | AC | 121 ms
67,404 KB |
testcase_72 | AC | 121 ms
66,816 KB |
testcase_73 | AC | 112 ms
66,960 KB |
testcase_74 | AC | 121 ms
67,768 KB |
testcase_75 | AC | 121 ms
67,172 KB |
testcase_76 | AC | 125 ms
67,816 KB |
testcase_77 | AC | 119 ms
67,368 KB |
testcase_78 | AC | 112 ms
68,056 KB |
testcase_79 | AC | 122 ms
67,228 KB |
testcase_80 | AC | 111 ms
68,420 KB |
testcase_81 | AC | 117 ms
68,388 KB |
testcase_82 | AC | 112 ms
67,092 KB |
testcase_83 | AC | 115 ms
68,332 KB |
testcase_84 | AC | 126 ms
67,736 KB |
testcase_85 | AC | 119 ms
66,492 KB |
testcase_86 | AC | 117 ms
67,652 KB |
testcase_87 | AC | 112 ms
68,448 KB |
testcase_88 | AC | 112 ms
67,400 KB |
testcase_89 | AC | 120 ms
67,244 KB |
testcase_90 | AC | 111 ms
68,112 KB |
testcase_91 | AC | 127 ms
67,384 KB |
testcase_92 | AC | 121 ms
68,068 KB |
testcase_93 | AC | 122 ms
68,068 KB |
testcase_94 | AC | 123 ms
67,220 KB |
testcase_95 | AC | 113 ms
66,792 KB |
testcase_96 | AC | 110 ms
67,812 KB |
testcase_97 | AC | 112 ms
67,368 KB |
testcase_98 | AC | 120 ms
68,092 KB |
testcase_99 | AC | 129 ms
67,108 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 = 1; 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 < 40 || pmax < 55 && mons[t] >= 8500000) { int x = 0; int need = 500000; for (int i = 1; i <= 5; i++) { if (mons[t] >= need + 500000) { 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]; } long can = mons[t] / 500; for (int i = 0; i < N; i++) { if (t >= 40) { l[i] = (int) (can * d[i] / dsum); } else if (r[t][i] == 0 || Math.sqrt(r[t][i]) * pow[i] > r[t][i] * 0.3) { int end = (int) (can * 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]; double v3 = v1 * 0.3; if (v2 > v3) { 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; } }