結果

問題 No.5003 物理好きクリッカー
ユーザー maimai
提出日時 2018-12-02 20:30:44
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
RE  
実行時間 -
コード長 8,527 bytes
コンパイル時間 2,561 ms
実行使用メモリ 22,020 KB
スコア 0
平均クエリ数 10000.00
最終ジャッジ日時 2021-07-19 07:56:37
合計ジャッジ時間 20,814 ms
ジャッジサーバーID
(参考情報)
judge12 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 RE -
testcase_01 RE -
testcase_02 RE -
testcase_03 RE -
testcase_04 RE -
testcase_05 RE -
testcase_06 RE -
testcase_07 RE -
testcase_08 RE -
testcase_09 RE -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 RE -
testcase_15 RE -
testcase_16 RE -
testcase_17 RE -
testcase_18 RE -
testcase_19 RE -
testcase_20 RE -
testcase_21 RE -
testcase_22 RE -
testcase_23 RE -
testcase_24 RE -
testcase_25 RE -
testcase_26 RE -
testcase_27 RE -
testcase_28 RE -
testcase_29 RE -
testcase_30 RE -
testcase_31 RE -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: 関数 ‘char* machineToString(EMachine)’ 内:
main.cpp:60:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   60 |         "hand",
      |         ^~~~~~
main.cpp:61:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   61 |         "lily",
      |         ^~~~~~
main.cpp:62:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   62 |         "factory",
      |         ^~~~~~~~~
main.cpp:63:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   63 |         "casino",
      |         ^~~~~~~~
main.cpp:64:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   64 |         "grimoire"
      |         ^~~~~~~~~~

ソースコード

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); }


// 


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:
            cout << "click" << endl;
            break;
        case kBuy:
            cout << "buy " << machineToString(target) << endl;
            break;
        case kReinforce:
            if (target == EMachine::kClicker)
                cout << "enhclick" << endl;
            else
                cout << "reinforce " << machineToString(target) << endl;
            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;
    cin >> n;
    assert(maxTurnCount == n);
    string l;
    cin >> 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();
            clog << state.wallet() << endl;
            state.applyAction(action, IN::effects[i]);
        }

    }

}


int main() {
    using namespace IN;

    //scan();
    generateInput();

    Solver::solve();

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

    return 0;
}
0