結果
問題 | No.5017 Tool-assisted Shooting |
ユーザー |
![]() |
提出日時 | 2023-07-16 17:40:29 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 484 ms / 2,000 ms |
コード長 | 6,804 bytes |
コンパイル時間 | 2,537 ms |
コンパイル使用メモリ | 82,764 KB |
実行使用メモリ | 77,316 KB |
スコア | 4,330,119 |
平均クエリ数 | 1000.00 |
最終ジャッジ日時 | 2023-07-16 17:41:12 |
合計ジャッジ時間 | 42,762 ms |
ジャッジサーバーID (参考情報) |
judge13 / judge11 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 100 |
ソースコード
import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;public class Main {static boolean batch = false;static boolean readFile = false;static int num = 0;static int H = 60;static int H1;static int W = 25;static int T = 1000;static int[][] hp0, hp, pw;static int[] ap, ap5;static int score, cx, lv, sum, t;static List<Character> ok;public static void main(String[] args) throws Exception {if (batch) {readFile = true;}if (readFile) {if (batch) {long tl = 2000; // TODOlong 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 < 10; 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(num);System.out.println(score);}} else {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));init(br);solve(br);}}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\\006\\in\\" + sb.toString() + ".txt");BufferedReader br = new BufferedReader(new FileReader(file));br.readLine();init(br);return solve(br);}static void init(BufferedReader br) throws Exception {H1 = H - 1;hp0 = new int[W][H];hp = new int[W][H];pw = new int[W][H];ap = new int[W];ap5 = new int[W];score = 0;cx = 12;lv = 1;sum = 0;ok = new ArrayList<>(3);}static int solve(BufferedReader br) throws Exception {for (t = 0; t < T; t++) {int n = Integer.parseInt(br.readLine());if (n == -1) {return score;}// 1マス下がるfor (int y = 0; y < H1; y++) {for (int x = 0; x < W; x++) {hp0[x][y] = hp0[x][y + 1];hp[x][y] = hp[x][y + 1];pw[x][y] = pw[x][y + 1];}}for (int x = 0; x < W; x++) {hp0[x][H1] = 0;hp[x][H1] = 0;pw[x][H1] = 0;}// 敵機出現for (int i = 0; i < n; i++) {String[] sa = br.readLine().split(" ");int h = Integer.parseInt(sa[0]);int p = Integer.parseInt(sa[1]);int x = Integer.parseInt(sa[2]);hp0[x][H1] = h;hp[x][H1] = h;pw[x][H1] = p;ap[x]++;}for (int x = 0; x < W; x++) {int val = 0;for (int x2 = x - 2; x2 <= x + 2; x2++) {int x3 = x2;if (x3 < 0) x3 += W;if (x3 >= W) x3 -= W;val += ap[x3];}ap5[x] = val;}// 自機移動char dir = getMoveDir();if (dir == 'L') {cx = left(cx);} else if (dir == 'R') {cx = right(cx);}if (!readFile) {System.out.println(dir);}// 攻撃for (int y = 1; y < H; y++) {if (hp[cx][y] > 0) {hp[cx][y] -= lv;if (hp[cx][y] <= 0) {hp[cx][y] = 0;score += hp0[cx][y];sum += pw[cx][y];lv = 1 + sum / 100;}break;}}}return score;}static char getMoveDir() {ok.clear();int lx = left(cx);int rx = right(cx);if (hp[lx][0] == 0 && hp[lx][1] <= lv) {ok.add('L');}if (hp[rx][0] == 0 && hp[rx][1] <= lv) {ok.add('R');}if (hp[cx][1] <= lv) {ok.add('S');}if (ok.isEmpty()) {return 'S';}if (ok.size() == 1) {return ok.get(0);}List<List<Teki>> list = new ArrayList<>(W);int cnt = 0;for (int x = 0; x < W; x++) {List<Teki> list2 = new ArrayList<>();int sum2 = sum;int turn = 0;for (int y = 1; y < H; y++) {if (hp[x][y] > 0) {int nlv = 1 + sum2 / 100;Teki o = makeTarget(x, y, nlv, turn);if (o == null) {break;}list2.add(o);cnt++;sum2 += o.pw;turn += o.turn;}}list.add(list2);}if (cnt == 0) {int max = 0;int maxidx = 0;for (int x = 0; x < W; x++) {if (ap5[x] > max) {max = ap5[x];maxidx = x;}}if (maxidx == cx && ok.contains('S')) {return 'S';}char ret = near(cx, maxidx);if (ok.contains(ret)) {return ret;}return 'S';} else {Teki best = null;for (int x = 0; x < W; x++) {List<Teki> list2 = list.get(x);if (list2.isEmpty()) {continue;}Teki o = list2.get(0);double maxVal = 0;double sum2 = 0;int turn = 0;for (Teki o2 : list2) {// TODOsum2 += t < 600 ? o2.pw : o2.hp0;turn += o2.turn;maxVal = Math.max(maxVal, sum2 / turn);}o.val = maxVal;if (best == null || o.val > best.val) {best = o;}}return best.dir;}}static Teki makeTarget(int x, int y, int lv, int pre) {int dx = W;char dir = 'S';if (x == cx || pre > 0) {dx = 0;} else {if (ok.contains('L')) {if (x <= cx) {dx = cx - x - 1;} else {dx = cx + W - x - 1;}dir = 'L';}if (ok.contains('R')) {int dx2 = 0;if (cx <= x) {dx2 = x - cx - 1;} else {dx2 = x + W - cx - 1;}if (dx2 < dx) {dx = dx2;dir = 'R';}}}int dy = y - dx - pre;int cnt = (hp[x][y] + lv - 1) / lv;if (dy < cnt) {return null;}Teki ret = new Teki(x, y);ret.dir = dir;ret.turn = dx + cnt;if (t + ret.turn > T) {return null;}return ret;}static char near(int from, int to) {int dxl = from - to;if (dxl < 0) dxl += W;int dxr = to - from;if (dxr < 0) dxr += W;if (dxl <= dxr) {return 'L';} else {return 'R';}}static int left(int x) {x--;if (x == -1) {x = W - 1;}return x;}static int right(int x) {x++;if (x == W) {x = 0;}return x;}static class Teki {int x, y, hp0, hp, pw;int turn;char dir;double val;public Teki(int x, int y) {this.x = x;this.y = y;this.hp0 = Main.hp0[x][y];this.hp = Main.hp[x][y];this.pw = Main.pw[x][y];}}}