結果
問題 | No.5017 Tool-assisted Shooting |
ユーザー |
![]() |
提出日時 | 2023-07-16 16:47:50 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 466 ms / 2,000 ms |
コード長 | 6,349 bytes |
コンパイル時間 | 3,097 ms |
コンパイル使用メモリ | 81,836 KB |
実行使用メモリ | 74,920 KB |
スコア | 4,035,021 |
平均クエリ数 | 985.23 |
最終ジャッジ日時 | 2023-07-16 16:48:34 |
合計ジャッジ時間 | 42,665 ms |
ジャッジサーバーID (参考情報) |
judge12 / judge17 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
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);}Teki[] arr = new Teki[W];int cnt = 0;for (int x = 0; x < W; x++) {for (int y = 1; y < H; y++) {if (hp[x][y] > 0) {arr[x] = makeTarget(x, y);if (arr[x] != null) {cnt++;}break;}}}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++) {Teki o = arr[x];if (o != null) {// TODOif (t < 700) {o.val = (double) o.pw / o.turn;} else {o.val = (double) o.hp0 / o.turn;}if (best == null || o.val > best.val) {best = o;}}}return best.dir;}}static Teki makeTarget(int x, int y) {int dx = W;char dir = 'S';if (x == cx) {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;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;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];}}}