結果

問題 No.5003 物理好きクリッカー
ユーザー simansiman
提出日時 2018-12-06 07:31:05
言語 C++11
(gcc 11.4.0)
結果
WA  
(最新)
AC  
(最初)
実行時間 -
コード長 8,021 bytes
コンパイル時間 613 ms
実行使用メモリ 22,008 KB
スコア 7,323,992
平均クエリ数 10000.00
最終ジャッジ日時 2021-07-19 08:50:01
合計ジャッジ時間 4,110 ms
ジャッジサーバーID
(参考情報)
judge14 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 40 ms
21,720 KB
testcase_01 AC 39 ms
21,516 KB
testcase_02 WA -
testcase_03 AC 41 ms
21,528 KB
testcase_04 AC 36 ms
21,540 KB
testcase_05 AC 41 ms
21,504 KB
testcase_06 AC 41 ms
21,516 KB
testcase_07 AC 41 ms
21,924 KB
testcase_08 WA -
testcase_09 WA -
testcase_10 AC 40 ms
21,360 KB
testcase_11 AC 40 ms
21,516 KB
testcase_12 AC 43 ms
21,876 KB
testcase_13 WA -
testcase_14 WA -
testcase_15 AC 41 ms
21,864 KB
testcase_16 AC 41 ms
21,516 KB
testcase_17 WA -
testcase_18 AC 41 ms
21,528 KB
testcase_19 WA -
testcase_20 AC 41 ms
21,516 KB
testcase_21 AC 41 ms
21,660 KB
testcase_22 WA -
testcase_23 AC 40 ms
21,516 KB
testcase_24 AC 39 ms
21,876 KB
testcase_25 AC 41 ms
21,876 KB
testcase_26 AC 40 ms
21,828 KB
testcase_27 AC 40 ms
21,528 KB
testcase_28 AC 39 ms
22,008 KB
testcase_29 WA -
testcase_30 AC 41 ms
21,180 KB
testcase_31 AC 40 ms
21,528 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <cassert>
#include <cmath>
#include <iostream>
#include <vector>
#include <string.h>

using namespace std;

const int N = 10000;

const int NOTHING = -1;
const int CLICK = 0;
const int BUY = 1;
const int SELL = 2;
const int REINFORCE = 3;
const int ENHCLICK = 4;
const int BUY_LILY = 5;

const int HAND = 1;
const int LILY = 2;
const int FACTORY = 3;
const int CASINO = 4;
const int GRIMOIRE = 5;

const int BONUS = 1;
const int FEVER = 2;
const int SALE = 3;

const int PRODUCTIVITY[6] = {
        1,
        1,
        10,
        120,
        2000,
        25000
};

const int UPDATE_COST[6][6] = {
        {
                15,
                150,
                1500,
                15000,
                150000,
                1500000
        },
        {
                150,
                1500,
                15000,
                150000,
                1500000,
                15000000
        },
        {
                2000,
                20000,
                200000,
                2000000,
                20000000,
                200000000,
        },
        {
                15,
                150,
                1500,
                15000,
                150000,
                1500000
        },
        {
                15,
                150,
                1500,
                15000,
                150000,
                1500000
        },
        {
                15,
                150,
                1500,
                15000,
                150000,
                1500000
        },
};

int factory_price[6][6];

int operations[N];
int bonus[N + 21];

class CookieClicker {
public:

    void init(string events) {
        memset(operations, CLICK, sizeof(operations));
        memset(bonus, NOTHING, sizeof(bonus));

        for (int i = 0; i < N; i++) {
            switch (events[i]) {
                case 'B':
                    bonus[i] = BONUS;
                    break;
                case 'F':
                    for (int j = i + 1; j <= i + 20; j++) {
                        bonus[j] = FEVER;
                    }
                    break;
                case 'S':
                    bonus[i + 1] = SALE;
                    break;
            }
        }

        int prices[6] = {0, 150, 2000, 30000, 600000, 10000000};

        for (int i = 1; i <= 5; i++) {
            int price = prices[i];

            for (int j = 0; j < 6; j++) {
                factory_price[i][j] = price;
                price = ceil((6 * price) / 5);
            }
        }
    }

    vector <string> run(string events) {
        init(events);

        vector<int> actions;
        actions.push_back(ENHCLICK);
        actions.push_back(ENHCLICK);
        actions.push_back(BUY_LILY);
        actions.push_back(ENHCLICK);
        actions.push_back(ENHCLICK);
        updateAnswer(actions);

        vector <string> answer = createAnswer();
        int score = calcScore();

        // printf("Score = %d\n", score);

        return answer;
    }

    vector <string> createAnswer() {
        vector <string> answer;

        for (int i = 0; i < N; i++) {
            switch (operations[i]) {
                case NOTHING:
                    answer.push_back("nothing");
                    break;
                case CLICK:
                    answer.push_back("click");
                    break;
                case BUY:
                    answer.push_back("buy");
                    break;
                case SELL:
                    break;
                case REINFORCE:
                    break;
                case ENHCLICK:
                    answer.push_back("enhclick");
                    break;
                case BUY_LILY:
                    answer.push_back("buy lily");
                    break;
                default:
                    assert(false);
            }
        }

        return answer;
    }

    void updateAnswer(vector<int> actions) {
        int index = 0;
        int clickLevel = 0;
        int factoryLevel = 0;
        int cookie = 0;
        int productivity = 0;
        int clickPower = 1;
        int updateCost;
        int clickPoint;
        int price;
        int factoryCount[6] = {0, 0, 0, 0, 0, 0};

        for (int i = 0; i < N; i++) {
            if (actions.size() <= index) break;

            clickPoint = clickPower;

            switch (actions[index]) {
                case ENHCLICK:
                    updateCost = UPDATE_COST[CLICK][clickLevel];
                    if (bonus[i] == SALE) {
                        updateCost = ceil(updateCost * 0.9) + 1;
                    }

                    if (cookie >= updateCost) {
                        cookie -= updateCost;
                        clickLevel++;
                        clickPower *= 2;
                        operations[i] = ENHCLICK;
                        index++;
                        clickPoint = 0;
                    }
                    break;
                case BUY_LILY:
                    price = factory_price[LILY][factoryCount[LILY]];

                    if (cookie >= price) {
                        cookie -= price;
                        factoryCount[LILY]++;
                        productivity += PRODUCTIVITY[LILY];
                        operations[i] = BUY_LILY;
                        index++;
                        clickPoint = 0;
                    }
                    break;
            }

            switch (bonus[i]) {
                case FEVER:
                    cookie += 7 * (productivity + clickPoint);
                    break;
                case BONUS:
                    cookie += productivity + clickPoint;
                    cookie += ceil(cookie * 0.01);
                    break;
                default:
                    cookie += productivity + clickPoint;
                    break;
            }
        }
    }

    int calcScore() {
        int cookie = 0;
        int clickPower = 1;
        int clickLevel = 0;
        int updateCost;
        int price;
        int factoryCount[6] = {0, 0, 0, 0, 0, 0};
        int productivity = 0;

        for (int i = 0; i < N; i++) {
            switch (operations[i]) {
                case NOTHING:
                    break;
                case CLICK:
                    if (bonus[i] == FEVER) {
                        cookie += 7 * clickPower;
                    } else {
                        cookie += clickPower;
                    }
                    break;
                case ENHCLICK:
                    updateCost = UPDATE_COST[CLICK][clickLevel];
                    if (bonus[i] == SALE) {
                        updateCost = ceil(updateCost * 0.9);
                    }
                    cookie -= updateCost;
                    clickPower *= 2;
                    clickLevel++;
                    break;
                case BUY_LILY:
                    price = factory_price[LILY][factoryCount[LILY]];

                    if (cookie >= price) {
                        cookie -= price;
                        factoryCount[LILY]++;
                        productivity += PRODUCTIVITY[LILY];
                    }
                    break;
            }

            switch (bonus[i]) {
                case FEVER:
                    cookie += 7 * productivity;
                    break;
                case BONUS:
                    cookie += productivity;
                    cookie += ceil(cookie * 0.01);
                    break;
                default:
                    cookie += productivity;
                    break;
            }

            // fprintf(stderr, "%d: cookie = %d\n", i, cookie);
        }

        fprintf(stderr, "clickLevel = %d\n", clickLevel);

        return cookie;
    }
};

int main() {
    int n;
    string s;
    CookieClicker cc;

    cin >> n;
    cin >> s;

    vector <string> answer = cc.run(s);

    for (int i = 0; i < N; i++) {
        cout << answer[i] << endl;
    }

    return 0;
}
0