結果
問題 | No.5017 Tool-assisted Shooting |
ユーザー |
|
提出日時 | 2023-07-16 17:44:22 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 277 ms / 2,000 ms |
コード長 | 6,066 bytes |
コンパイル時間 | 2,560 ms |
コンパイル使用メモリ | 218,576 KB |
実行使用メモリ | 24,336 KB |
スコア | 3,553,266 |
平均クエリ数 | 1000.00 |
最終ジャッジ日時 | 2023-07-16 17:44:51 |
合計ジャッジ時間 | 27,477 ms |
ジャッジサーバーID (参考情報) |
judge13 / judge15 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 100 |
ソースコード
#ifndef hari64#include <bits/stdc++.h>#pragma GCC target("avx2")#pragma GCC optimize("O3")#pragma GCC optimize("unroll-loops")#define debug(...)#else#include "util/viewer.hpp"#define debug(...) viewer::_debug(__LINE__, #__VA_ARGS__, __VA_ARGS__)#endif// clang-format offusing namespace std;using ll = long long; using ld = long double;using pii = pair<int, int>; using pll = pair<ll, ll>;template <typename T> using vc = vector<T>;template <typename T> using vvc = vector<vc<T>>;template <typename T> using vvvc = vector<vvc<T>>;using vi = vc<int>; using vl = vc<ll>; using vpi = vc<pii>; using vpl = vc<pll>;#define ALL(x) begin(x), end(x)#define RALL(x) (x).rbegin(), (x).rend()constexpr int INF = 1001001001; constexpr long long INFll = 1001001001001001001;template <class T> bool chmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; }template <class T> bool chmin(T& a, const T& b) { return a > b ? a = b, 1 : 0; }// clang-format onstruct Enemy {int h, p;int x, y;int initH;Enemy(int h, int p, int x) : h(h), p(p), x(x), y(59) { initH = h; }};constexpr int H = 60;constexpr int W = 25;vvc<Enemy> GRID(W);int NOW_X;int LEVEL;int POWER_SUM;int SCORE;void update(vvc<Enemy>& g) {for (int x = 0; x < W; x++) {if (g[x].empty()) continue;for (auto& e : g[x]) {e.y--;}if (g[x].back().y == -1) {g[x].pop_back();}assert(g[x].empty() || g[x].back().y != -1);}}tuple<int, int, string> simulate(vector<int>& enemy) {string moves = "";int score = 0;int score2 = 0;int nowX = NOW_X;int level = LEVEL;int powerSum = POWER_SUM;int totalTurn = 0;int enemyIndex = 0;auto grid = GRID;// for (int x = 0; x < W; x++) {// set<int> check;// for (auto& e : grid[x]) {// check.insert(e.y);// }// assert(check.size() == grid[x].size());// }while (true) {totalTurn++;if (totalTurn > 1000) break;string move = "S";if (nowX < enemy[enemyIndex]) {if (enemy[enemyIndex] - nowX < 12) {move = "R";} else {move = "L";}} else if (nowX > enemy[enemyIndex]) {if (nowX - enemy[enemyIndex] < 12) {move = "L";} else {move = "R";}}if (enemyIndex < 1) {moves += move;}if (move == "L") nowX = (25 + nowX - 1) % 25;if (move == "R") nowX = (25 + nowX + 1) % 25;if (move == "S") nowX = nowX;if (grid[nowX].empty()) continue;if (grid[nowX].back().y <= 1) {return {-INF, -INF, "S"};}grid[nowX].back().h -= level;score2 += grid[nowX].back().initH;if (grid[nowX].back().h <= 0) {score += grid[nowX].back().initH;powerSum += grid[nowX].back().p;level = 1 + powerSum / 100;grid[nowX].pop_back();while (enemyIndex < int(enemy.size()) && grid[enemy[enemyIndex]].empty()) {enemyIndex++;}if (enemyIndex >= int(enemy.size())) break;}update(grid);}return {score / totalTurn, score2, moves};}string solve() {int bestScore = -1;string bestMove = "S";if (LEVEL <= 150) {for (int e1 = 0; e1 < W; e1++) {if (GRID[e1].empty()) continue;vi enemies = {e1};auto [score, _, move] = simulate(enemies);if (chmax(bestScore, score)) {bestMove = move;}}} else {for (int e1 = 0; e1 < W; e1++) {if (GRID[e1].empty()) continue;for (int e2 = 0; e2 < W; e2++) {if (GRID[e2].empty()) continue;vi enemies = {e1, e2};auto [score, _, move] = simulate(enemies);if (chmax(bestScore, score)) {bestMove = move;}}}}if (bestScore == -1) {debug("Game Over?");bestMove = "S";}// assert(!bestMove.empty());// debug(bestScore, bestMove);return bestMove;}int main() {cin.tie(0);ios::sync_with_stdio(false);#ifdef hari64for (int _ = 0; _ < W; _++) {int p;cin >> p;assert(1 <= p && p <= 8);}#endifNOW_X = 12;LEVEL = 1;POWER_SUM = 0;SCORE = 0;const int NUM_OF_TURNS = 1000;string moves = "";vector<string> ans;for (int i = 0; i < NUM_OF_TURNS; i++) {// debug(i);update(GRID);int n;cin >> n;if (n == -1) break;for (int i = 0; i < n; i++) {int h, p, x;cin >> h >> p >> x;assert(GRID[x].empty() || GRID[x].front().y < 59);GRID[x].insert(GRID[x].begin(), Enemy(h, p, x));}string s;if (i <= 5) {s = "S";} else if (i <= 40) {if (moves.size() == 0) {moves = solve();}s = string(1, moves[0]);moves.erase(moves.begin());} else {s = string(1, solve()[0]);}#ifndef hari64cout << s << endl;flush(cout);#endifans.push_back(s);if (s == "L") NOW_X = (25 + NOW_X - 1) % 25;if (s == "R") NOW_X = (25 + NOW_X + 1) % 25;if (s == "S") NOW_X = NOW_X;if (GRID[NOW_X].empty()) continue;GRID[NOW_X].back().h -= LEVEL;if (GRID[NOW_X].back().h <= 0) {SCORE += GRID[NOW_X].back().initH;POWER_SUM += GRID[NOW_X].back().p;LEVEL = 1 + POWER_SUM / 100;GRID[NOW_X].pop_back();}}debug(SCORE, LEVEL, POWER_SUM, NOW_X);#ifdef hari64for (auto s : ans) {cout << s << endl;}#endifreturn 0;}