結果
| 問題 |
No.5003 物理好きクリッカー
|
| コンテスト | |
| ユーザー |
siman
|
| 提出日時 | 2018-12-06 00:25:31 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 6,023 bytes |
| コンパイル時間 | 565 ms |
| 実行使用メモリ | 21,876 KB |
| スコア | 1,529,728 |
| 平均クエリ数 | 10000.00 |
| 最終ジャッジ日時 | 2021-07-19 08:49:27 |
| 合計ジャッジ時間 | 3,992 ms |
|
ジャッジサーバーID (参考情報) |
judge10 / judge11 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 WA * 11 |
ソースコード
#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 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 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;
}
}
}
vector <string> run(string events) {
init(events);
vector<int> actions;
actions.push_back(ENHCLICK);
actions.push_back(ENHCLICK);
actions.push_back(ENHCLICK);
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;
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;
for (int i = 0; i < N; i++) {
if (actions.size() <= index) break;
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++;
continue;
}
break;
}
switch (bonus[i]) {
case FEVER:
cookie += 7 * (productivity + clickPower);
break;
case BONUS:
cookie += productivity + clickPower;
cookie += ceil(cookie * 0.01);
break;
default:
cookie += productivity + clickPower;
break;
}
}
}
int calcScore() {
int score = 0;
int clickPower = 1;
int clickLevel = 0;
for (int i = 0; i < N; i++) {
switch (operations[i]) {
case NOTHING:
break;
case CLICK:
if (bonus[i] == FEVER) {
score += 7 * clickPower;
} else {
score += clickPower;
}
break;
case ENHCLICK:
score -= UPDATE_COST[CLICK][clickLevel];
clickPower *= 2;
clickLevel++;
break;
}
if (bonus[i] == BONUS) {
score += ceil(score * 0.01);
}
// fprintf(stderr, "%d: cookie = %d\n", i, score);
}
fprintf(stderr, "clickLevel = %d\n", clickLevel);
return score;
}
};
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;
}
siman