結果
| 問題 |
No.5003 物理好きクリッカー
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-12-01 02:07:41 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 7,383 bytes |
| コンパイル時間 | 2,947 ms |
| 実行使用メモリ | 22,008 KB |
| スコア | 0 |
| 平均クエリ数 | 10000.00 |
| 最終ジャッジ日時 | 2021-07-19 07:25:49 |
| 合計ジャッジ時間 | 21,518 ms |
|
ジャッジサーバーID (参考情報) |
judge12 / judge10 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | RE * 32 |
コンパイルメッセージ
main.cpp: 関数 ‘char* machineToString(EMachine)’ 内:
main.cpp:59:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
59 | "hand",
| ^~~~~~
main.cpp:60:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
60 | "lily",
| ^~~~~~
main.cpp:61:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
61 | "factory",
| ^~~~~~~~~
main.cpp:62:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
62 | "casino",
| ^~~~~~~~
main.cpp:63:9: 警告: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
63 | "grimore"
| ^~~~~~~~~
ソースコード
#pragma GCC optimize ("O3")
// #pragma GCC target ("avx")
#include "bits/stdc++.h"
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, kGrimore, 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",
"grimore"
};
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, 60000, 10000000};
array<ll, 6> costRfMachine_ = {1500, 20000, 300000, 600000, 100000000};
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 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];
}
void applyAction(Action act, EEffect eff) {
if (act.command == ECommand::kClick) {
}
else if (act.command == ECommand::kBuy) {
numMachine_[act.target] += 1;
wallet_ -= costBuyMachine_[act.target];
costBuyMachine_[act.target] = (costBuyMachine_[act.target] * 6 + 4) / 5;
}
else if (act.command == ECommand::kReinforce) {
lvlMachine_[act.target] += 1;
wallet_ -= costRfMachine_[act.target];
costRfMachine_[act.target] = (costRfMachine_[act.target] * 10);
}
ll fever = eff == EEffect::kFever ? 7 : 1;
for (int i = 4 + (act.command == ECommand::kClick); i >= 0; --i) {
wallet_ += efficiency((EMachine)i);
}
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("DFS"[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.costBuyMachine((EMachine)m) <= state.wallet()) {
action = Action(ECommand::kBuy, (EMachine)m);
}
}
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;
}