結果

問題 No.5003 物理好きクリッカー
ユーザー maimai
提出日時 2018-12-02 20:44:03
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
TLE  
実行時間 -
コード長 11,328 bytes
コンパイル時間 2,538 ms
実行使用メモリ 40,800 KB
スコア 0
最終ジャッジ日時 2021-07-19 07:57:22
合計ジャッジ時間 25,236 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 TLE -
testcase_01 -- -
testcase_02 -- -
testcase_03 -- -
testcase_04 -- -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: 関数 ‘char* machineToString(EMachine)’ 内:
main.cpp:123:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  123 |         "hand",
      |         ^~~~~~
main.cpp:124:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  124 |         "lily",
      |         ^~~~~~
main.cpp:125:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  125 |         "factory",
      |         ^~~~~~~~~
main.cpp:126:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  126 |         "casino",
      |         ^~~~~~~~
main.cpp:127:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  127 |         "grimoire"
      |         ^~~~~~~~~~
main.cpp: メンバ関数 ‘void Action::print() const’ 内:
main.cpp:156:24: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  156 |             printer << "click\n";
      |                        ^~~~~~~~~
main.cpp:159:24: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  159 |             printer << "buy " << machineToString(target) << '\n';
      |                        ^~~~~~
main.cpp:163:28: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  163 |                 printer << "enhclick" << '\n';
      |                            ^~~~~~~~~~
main.cpp:165:28: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  165 |                 printer << "reinforce " << machineToString(target) << '\n';
      |                            ^~~~~~~~~~~~

ソースコード

diff #

#pragma GCC optimize ("O3")
// #pragma GCC target ("avx")
#include "bits/stdc++.h"
// #define NDEBUG

using namespace std;
using ll = long long int;

#define debugos cout
#define debug(v) {printf("L%d %s > ",__LINE__,#v);debugos<<(v)<<endl;}
#define debugv(v) {printf("L%d %s > ",__LINE__,#v);for(auto e:(v)){debugos<<e<<" ";}debugos<<endl;}
#define debuga(m,w) {printf("L%d %s > ",__LINE__,#m);for(int x=0;x<(w);x++){debugos<<(m)[x]<<" ";}debugos<<endl;}
#define debugaa(m,h,w) {printf("L%d %s >\n",__LINE__,#m);for(int y=0;y<(h);y++){for(int x=0;x<(w);x++){debugos<<(m)[y][x]<<" ";}debugos<<endl;}}
#define ALL(v) (v).begin(),(v).end()
#define repeat(cnt,l) for(auto cnt=decltype(l)();(cnt)<(l);++(cnt))
#define rrepeat(cnt,l) for(auto cnt=(l)-1;0<=(cnt);--(cnt))
#define iterate(cnt,b,e) for(auto cnt=(b);(cnt)!=(e);++(cnt))
#define diterate(cnt,b,e) for(auto cnt=(b);(cnt)!=(e);--(cnt))
const ll MD = 1000000007ll; const long double PI = 3.1415926535897932384626433832795L;
inline void assert_call(bool assertion, function<void()> f) { if (!assertion) { cerr << "assertion fault:" << endl; f(); abort(); } }
template<typename T1, typename T2> inline ostream& operator <<(ostream &o, const pair<T1, T2> p) { o << '(' << p.first << ':' << p.second << ')'; return o; }
template<typename Vec> inline ostream& _ostream_vecprint(ostream& os, const Vec& a) {
    os << '['; for (const auto& e : a) os << ' ' << e << ' '; os << ']'; return os;
}
template<typename T> inline ostream& operator<<(ostream& o, const vector<T>& v) { return _ostream_vecprint(o, v); }
template<typename T, size_t S> inline ostream& operator<<(ostream& o, const array<T, S>& v) { return _ostream_vecprint(o, v); }
template<typename T> inline T& chmax(T& to, const T& val) { return to = max(to, val); }
template<typename T> inline T& chmin(T& to, const T& val) { return to = min(to, val); }
void bye(string s, int code = 0) { cout << s << endl; exit(code); }
mt19937_64 randdev(8901016);
template<typename T, typename Random = decltype(randdev), typename enable_if<is_integral<T>::value>::type* = nullptr>
inline T rand(T l, T h, Random& rand = randdev) { return uniform_int_distribution<T>(l, h)(rand); }
template<typename T, typename Random = decltype(randdev), typename enable_if<is_floating_point<T>::value>::type* = nullptr>
inline T rand(T l, T h, Random& rand = randdev) { return uniform_real_distribution<T>(l, h)(rand); }

#if defined(_WIN32) || defined(_WIN64)
#define getchar_unlocked _getchar_nolock
#define putchar_unlocked _putchar_nolock
#elif defined(__GNUC__)
#else
#define getchar_unlocked getchar
#define putchar_unlocked putchar
#endif
namespace {
#define isvisiblechar(c) (0x21<=(c)&&(c)<=0x7E)
    class MaiScanner {
    public:
        template<typename T> void input_integer(T& var) noexcept {
            var = 0; T sign = 1;
            int cc = getchar_unlocked();
            for (; cc < '0' || '9' < cc; cc = getchar_unlocked())
                if (cc == '-') sign = -1;
            for (; '0' <= cc && cc <= '9'; cc = getchar_unlocked())
                var = (var << 3) + (var << 1) + cc - '0';
            var = var * sign;
        }
        inline int c() noexcept { return getchar_unlocked(); }
        inline MaiScanner& operator>>(int& var) noexcept { input_integer<int>(var); return *this; }
        inline MaiScanner& operator>>(long long& var) noexcept { input_integer<long long>(var); return *this; }
        inline MaiScanner& operator>>(string& var) {
            int cc = getchar_unlocked();
            for (; !isvisiblechar(cc); cc = getchar_unlocked());
            for (; isvisiblechar(cc); cc = getchar_unlocked())
                var.push_back(cc);
            return *this;
        }
        template<typename IT> inline void in(IT begin, IT end) { for (auto it = begin; it != end; ++it) *this >> *it; }
    };
    class MaiPrinter {
    public:
        template<typename T>
        void output_integer(T var) noexcept {
            if (var == 0) { putchar_unlocked('0'); return; }
            if (var < 0)
                putchar_unlocked('-'),
                var = -var;
            char stack[32]; int stack_p = 0;
            while (var)
                stack[stack_p++] = '0' + (var % 10),
                var /= 10;
            while (stack_p)
                putchar_unlocked(stack[--stack_p]);
        }
        inline MaiPrinter& operator<<(char c) noexcept { putchar_unlocked(c); return *this; }
        inline MaiPrinter& operator<<(int var) noexcept { output_integer<int>(var); return *this; }
        inline MaiPrinter& operator<<(long long var) noexcept { output_integer<long long>(var); return *this; }
        inline MaiPrinter& operator<<(char* str_p) noexcept { while (*str_p) putchar_unlocked(*(str_p++)); return *this; }
        inline MaiPrinter& operator<<(const string& str) {
            const char* p = str.c_str();
            const char* l = p + str.size();
            while (p < l) putchar_unlocked(*p++);
            return *this;
        }
        template<typename IT> void join(IT begin, IT end, char sep = ' ') { for (bool b = 0; begin != end; ++begin, b = 1) b ? *this << sep << *begin : *this << *begin; }
    };
}
MaiScanner scanner;
MaiPrinter printer;

// 


enum EMachine {
    kHand = 0, kLily, kFactory, kCasino, kGrimoire, kClicker
};

enum ECommand {
    kClick = 0,
    kBuy,
    kReinforce
};

enum EEffect {
    kNothing = 0,
    kBonus,
    kFever,
    kSale
};


inline char* machineToString(EMachine m) {
    static char* s[] = {
        "hand",
        "lily",
        "factory",
        "casino",
        "grimoire"
    };
    return s[(int)m];
}


inline EEffect charToEffect(char c) {
    return
        c == 'N' ? EEffect::kNothing :
        c == 'B' ? EEffect::kBonus :
        c == 'F' ? EEffect::kFever :
        c == 'S' ? EEffect::kSale : EEffect::kNothing;
}


//


struct Action {
    ECommand command;
    EMachine target;
    Action(ECommand aCommand, EMachine aTarget = EMachine::kHand)
        :command(aCommand), target(aTarget) {
    }

    void print() const {
        switch (command)
        {
        case kClick:
            printer << "click\n";
            break;
        case kBuy:
            printer << "buy " << machineToString(target) << '\n';
            break;
        case kReinforce:
            if (target == EMachine::kClicker)
                printer << "enhclick" << '\n';
            else
                printer << "reinforce " << machineToString(target) << '\n';
            break;
        default:
            clog << "invalid command\n";
            break;
        }
    }
};


class State {

    ll wallet_;
    array<int, 6> numMachine_;
    array<int, 6> lvlMachine_;
    array<ll, 5> costBuyMachine_ = { 150, 2000, 30000, 600000, 10000000 };
    array<ll, 6> costRfMachine_ = { 1500, 20000, 300000, 6000000, 100000000, 15 };

public:

    State() :wallet_(0) {
        numMachine_.fill(0);
        numMachine_[5] = 1;
        lvlMachine_.fill(0);
    }

    //
    inline ll costBuyMachine(EMachine e) const {
        return costBuyMachine_[(int)e];
    }
    inline ll costReinforceMachine(EMachine e) const {
        return costRfMachine_[(int)e];
    }
    inline ll wallet() const {
        return wallet_;
    }
    inline int countOfMachine(EMachine e) const {
        return numMachine_[(int)e];
    }

    //
    inline ll efficiency(EMachine e) const {
        const ll s[] = { 1, 10, 120, 2000, 25000, 1 };
        return s[(int)e] * (1ll << lvlMachine_[(int)e])*numMachine_[(int)e];
    }

    inline void buyMachine(EMachine e, bool sale = false) {
        if (sale)
            wallet_ -= (costBuyMachine_[(int)e] * 9 + 9) / 10;
        else
            wallet_ -= costBuyMachine_[(int)e];
        assert(wallet_ >= 0);
        costBuyMachine_[(int)e] = (costBuyMachine_[(int)e] * 6 + 4) / 5;
        numMachine_[(int)e] += 1;
    }

    inline void reinforceMachine(EMachine e, bool sale = false) {
        if (sale)
            wallet_ -= (costRfMachine_[(int)e] * 9 + 9) / 10;
        else
            wallet_ -= costRfMachine_[(int)e];
        assert(wallet_ >= 0);
        costRfMachine_[(int)e] = (costRfMachine_[(int)e] * 10);
        lvlMachine_[(int)e] += 1;
    }

    void applyAction(Action act, EEffect eff) {

        ll fever = eff == EEffect::kFever ? 7 : 1;

        // action
        if (act.command == ECommand::kClick) {
            wallet_ += fever*efficiency(EMachine::kClicker);
        }
        else if (act.command == ECommand::kBuy) {
            buyMachine(act.target, eff == EEffect::kSale);
        }
        else if (act.command == ECommand::kReinforce) {
            reinforceMachine(act.target, eff == EEffect::kSale);
        }

        // facility
        for (int i = 4; i >= 0; --i) {
            wallet_ += fever*efficiency((EMachine)i);
        }

        // bonus
        if (eff == EEffect::kBonus) {
            wallet_ += (wallet_ + 99) / 100;
        }
    }

};


//


namespace IN {
    const int maxTurnCount = 10000;
    EEffect effects[maxTurnCount];
}


//


void convertinput(const string& l) {

    using namespace IN;
    int fever = 0;
    int sale = 0;
    repeat(i, maxTurnCount) {
        auto e = charToEffect(l[i]);
        effects[i] = e == EEffect::kBonus ? EEffect::kBonus : EEffect::kNothing;
        if (fever > 0) {
            --fever;
            effects[i] = EEffect::kFever;
        }
        if (sale > 0) {
            --sale;
            effects[i] = EEffect::kSale;
        }
        if (e == EEffect::kFever) {
            fever = 20;
        }
        else if (e == EEffect::kSale) {
            sale = 1;
        }
    }
}


void generateInput() {
    using namespace IN;

    string l; l.reserve(maxTurnCount);
    int next = rand(0, 200);
    repeat(i, maxTurnCount) {
        if (next > 0) {
            --next;
            l.push_back('N');
        }
        else {
            l.push_back("BFS"[rand(0, 2)]);
            next = rand(100, 200);
        }
    }
    convertinput(l);
}


void scan() {
    using namespace IN;
    int n;
    scanner >> n;
    assert(maxTurnCount == n);
    string l;
    scanner >> l;

    convertinput(l);
}


//


namespace Solver {

    void solve() {

        State state;

        repeat(i, IN::maxTurnCount) {

            Action action(ECommand::kClick);

            rrepeat(m, 5) {
                if (state.countOfMachine((EMachine)m) == 0 ||
                    state.costBuyMachine((EMachine)m) < state.costReinforceMachine((EMachine)m)) {
                    if (state.costBuyMachine((EMachine)m) <= state.wallet()) {
                        action = Action(ECommand::kBuy, (EMachine)m);
                        break;
                    }
                }
                else {
                    if (state.costReinforceMachine((EMachine)m) <= state.wallet()) {
                        action = Action(ECommand::kReinforce, (EMachine)m);
                        break;
                    }
                }
            }

            action.print();
            state.applyAction(action, IN::effects[i]);
        }

    }

}


int main() {
    using namespace IN;

    scan();
    //generateInput();

    Solver::solve();

    string str;
    repeat(i, maxTurnCount) {
        str.clear();
        scanner >> str;
        assert(str == "ok");
    }

    return 0;
}
0