結果
問題 | No.5003 物理好きクリッカー |
ユーザー | EvbCFfp1XB |
提出日時 | 2018-12-08 15:31:18 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 857 ms / 10,000 ms |
コード長 | 11,042 bytes |
コンパイル時間 | 1,996 ms |
実行使用メモリ | 69,120 KB |
スコア | 53,327,563,656 |
平均クエリ数 | 10000.00 |
最終ジャッジ日時 | 2021-07-19 09:10:53 |
合計ジャッジ時間 | 33,508 ms |
ジャッジサーバーID (参考情報) |
judge15 / judge14 |
純コード判定しない問題か言語 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 755 ms
65,020 KB |
testcase_01 | AC | 764 ms
68,036 KB |
testcase_02 | AC | 850 ms
67,924 KB |
testcase_03 | AC | 764 ms
67,752 KB |
testcase_04 | AC | 772 ms
63,696 KB |
testcase_05 | AC | 857 ms
67,968 KB |
testcase_06 | AC | 769 ms
64,084 KB |
testcase_07 | AC | 786 ms
67,900 KB |
testcase_08 | AC | 856 ms
65,060 KB |
testcase_09 | AC | 780 ms
67,640 KB |
testcase_10 | AC | 805 ms
67,800 KB |
testcase_11 | AC | 768 ms
68,144 KB |
testcase_12 | AC | 806 ms
65,784 KB |
testcase_13 | AC | 767 ms
67,808 KB |
testcase_14 | AC | 768 ms
67,852 KB |
testcase_15 | AC | 806 ms
67,972 KB |
testcase_16 | AC | 771 ms
64,416 KB |
testcase_17 | AC | 765 ms
68,012 KB |
testcase_18 | AC | 785 ms
64,012 KB |
testcase_19 | AC | 840 ms
67,740 KB |
testcase_20 | AC | 763 ms
67,728 KB |
testcase_21 | AC | 772 ms
68,176 KB |
testcase_22 | AC | 844 ms
68,060 KB |
testcase_23 | AC | 840 ms
63,916 KB |
testcase_24 | AC | 751 ms
67,760 KB |
testcase_25 | AC | 764 ms
67,804 KB |
testcase_26 | AC | 763 ms
68,032 KB |
testcase_27 | AC | 811 ms
59,380 KB |
testcase_28 | AC | 778 ms
59,892 KB |
testcase_29 | AC | 851 ms
68,108 KB |
testcase_30 | AC | 749 ms
68,024 KB |
testcase_31 | AC | 769 ms
59,512 KB |
ソースコード
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; public class Main { static final XorShift rng = new XorShift(System.nanoTime()); static final Watch watch = new Watch(); private SAState sa = new SAState(); private long numCookies; private int turn = -1; private long add = 1; private long price = 15; private int count = 1; private int reinforce = 0; private String[] names = new String[] { "hand", "lily", "factory", "casino", "grimoire", }; private long[] adds = new long[] { 1, 10, 120, 2000, 25000, }; private long[] prices = new long[] { 150, 2000, 30000, 600000, 10000000, }; private int[] counts = new int[] { 0, 0, 0, 0, 0, }; private int[] reinforces = new int[] { 0, 0, 0, 0, 0, }; private boolean isSale; private int fever; private long buyPrice(int index) { if (index < 0) { long p = price; return p; } long p = prices[index]; for (int i = 0; i < counts[index]; i++) { p = (long) Math.ceil((p * 6.0) / 5.0); } return p; } private long sellPrice(int index) { long p = prices[index]; for (int i = 0; i < counts[index]; i++) { p = (long) Math.ceil((p * 6.0) / 5.0); } return (long) Math.ceil(p * 0.25); } private long reinforcePrice(int index) { if (index < 0) { long p = price; for (int i = 0; i < reinforce; i++) { p *= 10; } return p; } long p = prices[index]; for (int i = 0; i < reinforces[index]; i++) { p *= 10; } return p; } private void solve(String S) { turn++; long prevNumCookies = numCookies; String command = "click"; int index = -1; // if (turn < 8500) long rp = (long) ((isSale ? 0.9 : 1) * reinforcePrice(-1)); { double d = 1.0; if (numCookies >= rp) { if ((10000 - turn) * (add * (1L << (reinforce + 1))) - rp > d * (10000 - turn) * (add * (1L << reinforce))) { command = "enhclick"; index = -1; } } for (int i = prices.length - 1; i >= 0; i--) { long bp = (long) ((isSale ? 0.9 : 1) * buyPrice(i)); if (numCookies < bp) { continue; } long cookie = cookiesWithOutFever(); counts[i]++; long cookieBuy = cookiesWithOutFever(); counts[i]--; if ((10000 - turn) * cookieBuy - bp < d * (10000 - turn) * cookie) { continue; } command = "buy"; index = i; break; } for (int i = prices.length - 1; i >= 0; i--) { long rp2 = (long) ((isSale ? 0.9 : 1) * reinforcePrice(i)); if (numCookies < rp2) { continue; } if (counts[i] <= 0) { continue; } long cookie = cookiesWithOutFever(); reinforces[i]++; long cookieReinforce = cookiesWithOutFever(); reinforces[i]--; if ((10000 - turn) * cookieReinforce - rp2 < d * (10000 - turn) * cookie) { continue; } command = "reinforce"; index = i; break; } for (int i = prices.length - 1; i >= 0; i--) { long sp = sellPrice(i); if (counts[i] <= 0) { continue; } long cookie = cookiesWithOutFever(); counts[i]--; long cookieSell = cookiesWithOutFever(); counts[i]++; if ((10000 - turn) * cookieSell + sp < d * (10000 - turn) * cookie) { continue; } command = "sell"; index = i; break; } } // numCookies -= price[i]; // count[i]++; if (command.equals("click")) { numCookies += (fever > 0 ? 7 : 1) * add * (1L << reinforce); } else if (command.equals("enhclick")) { numCookies -= rp; reinforce++; } else if (command.equals("buy")) { numCookies -= (long) ((isSale ? 0.9 : 1) * buyPrice(index)); if (index < 0) { count++; } else { counts[index]++; } } else if (command.equals("reinforce")) { numCookies -= (long) ((isSale ? 0.9 : 1) * reinforcePrice(index)); reinforces[index]++; } else if (command.equals("sell")) { numCookies += sellPrice(index); counts[index]--; } numCookies += cookies(); isSale = false; if (fever > 0) { fever--; } if (S.equals("B")) { numCookies += (long) (0.01 * numCookies); } else if (S.equals("S")) { isSale = true; } else if (S.equals("F")) { fever = 20; } if (!command.equals("click") || turn >= 9998) { Utils.debug(turn, "numCookies", prevNumCookies, numCookies, "cookie", cookies(), "command", command + (index >= 0 ? " " + index : "")); } System.out.println(command + (index >= 0 ? " " + names[index] : "")); System.out.flush(); } private long cookies() { long cookie = 0; for (int i = 0; i < adds.length; i++) { cookie += (fever > 0 ? 7 : 1) * adds[i] * counts[i] * (1L << reinforces[i]); } return cookie; } private long cookiesWithOutFever() { long cookie = 0; for (int i = 0; i < adds.length; i++) { cookie += adds[i] * counts[i] * (1L << reinforces[i]); } return cookie; } public void run() { try (BufferedReader in = new BufferedReader(new InputStreamReader(System.in))) { int N = Integer.parseInt(in.readLine()); for (int i = 0; i < N; i++) { String S = in.readLine(); solve(S); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { new Main().run(); } } class SAState { public static final boolean useTime = true; public double startTime = 0; public double endTime = 10 * 10 * 10; public double time = startTime; public double startTemperature = 100; public double endTemperature = 0; public double inverseTemperature = 1.0 / startTemperature; public double lastAcceptTemperature = startTemperature; public double startRange = 1; public double endRange = 1e4; public double range = startRange; public int numIterations; public int validIterations; public int acceptIterations; public void init() { numIterations = 0; validIterations = 0; acceptIterations = 0; startTime = useTime ? Main.watch.getSecond() : numIterations; update(); lastAcceptTemperature = inverseTemperature; } public void update() { updateTime(); updateTemperature(); updateRange(); } public void updateTemperature() { inverseTemperature = 1.0 / (endTemperature + (startTemperature - endTemperature) * Math.pow((endTime - time) / (endTime - startTime), 1.0)); } public void updateRange() { range = endRange + (startRange - endRange) * Math.pow((endTime - time) / (endTime - startTime), 1.0); } public void updateTime() { time = useTime ? Main.watch.getSecond() : numIterations; } public boolean isTLE() { return time >= endTime; } public boolean accept(double deltaScore) { return acceptS(deltaScore); } public boolean acceptB(double deltaScore) { validIterations++; if (deltaScore > -1e-9) { acceptIterations++; return true; } assert deltaScore < 0; assert 1.0 / inverseTemperature >= 0; if (deltaScore * inverseTemperature < -10) { return false; } if (Main.rng.nextDouble() < Math.exp(deltaScore * inverseTemperature)) { acceptIterations++; lastAcceptTemperature = inverseTemperature; return true; } return false; } public boolean acceptS(double deltaScore) { validIterations++; if (deltaScore < 1e-9) { acceptIterations++; return true; } assert deltaScore > 0; assert 1.0 / inverseTemperature >= 0; if (-deltaScore * inverseTemperature < -10) { return false; } if (Main.rng.nextDouble() < Math.exp(-deltaScore * inverseTemperature)) { acceptIterations++; lastAcceptTemperature = inverseTemperature; return true; } return false; } } final class Utils { private Utils() { } public static final void debug(Object... o) { System.err.println(toString(o)); } public static final String toString(Object... o) { return Arrays.deepToString(o); } } class Watch { private long start; public Watch() { init(); } public double getSecond() { return (System.nanoTime() - start) * 1e-9; } public void init() { init(System.nanoTime()); } private void init(long start) { this.start = start; } public String getSecondString() { return toString(getSecond()); } public static final String toString(double second) { if (second < 60) { return String.format("%5.2fs", second); } else if (second < 60 * 60) { int minute = (int) (second / 60); return String.format("%2dm%2ds", minute, (int) (second % 60)); } else { int hour = (int) (second / (60 * 60)); int minute = (int) (second / 60); return String.format("%2dh%2dm%2ds", hour, minute % (60), (int) (second % 60)); } } } class XorShift { private int w = 88675123; private int x = 123456789; private int y = 362436069; private int z = 521288629; public XorShift(long l) { x = (int) l; } public int nextInt() { final int t = x ^ (x << 11); x = y; y = z; z = w; w = w ^ (w >>> 19) ^ (t ^ (t >>> 8)); return w; } public double nextDouble() { return (nextInt() >>> 1) * 4.6566128730773926E-10; } public int nextInt(int n) { return (int) (n * nextDouble()); } }