結果
| 問題 |
No.5003 物理好きクリッカー
|
| コンテスト | |
| ユーザー |
sinsincoscos
|
| 提出日時 | 2018-12-05 14:22:26 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 314 ms / 10,000 ms |
| コード長 | 3,731 bytes |
| コンパイル時間 | 464 ms |
| 実行使用メモリ | 21,972 KB |
| スコア | 8,688,426,833 |
| 平均クエリ数 | 10000.00 |
| 最終ジャッジ日時 | 2021-07-19 08:46:05 |
| 合計ジャッジ時間 | 13,076 ms |
|
ジャッジサーバーID (参考情報) |
judge10 / judge12 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 32 |
ソースコード
#include <iostream>
#include <stdio.h>
#include <cassert>
using namespace std;
typedef long long ll;
typedef pair<ll,int> P;
ll N;
int ans[10200][2] = {{0}};
ll resB[10200] = {0},resF[10200] = {0},resS[10200] = {0};
ll fac_num[6] = {0},fac_level[6] = {0},beki[21] = {1};
ll fac_price[6] = {15,150,2000,30000,600000,10000000};//逐次更新する
ll fac_reinforce_price[6] = {150,1500,20000,30000,600000,100000000};//逐次更新する
ll fac_gain[6] = {1,1,10,120,2000,25000};
string fac_name[6] = {"click","hand","lily","factory","casino","grimoire"};
string S,result;
void show(){
for(int i=1;i<=N;i++){
if(ans[i][0]==1) cout << "click" << endl;
if(ans[i][0]==2) cout << "buy " << fac_name[ans[i][1]] << endl;
if(ans[i][0]==3) cout << "sell " << fac_name[ans[i][1]] << endl;
if(ans[i][0]==4) cout << "reinforce " << fac_name[ans[i][1]] << endl;
if(ans[i][0]==5) cout << "enhclick" << endl;
if(ans[i][0]==6) cout << "nothing" << endl;
cin >> result;
}
}
ll gain_from_fac(){
ll gain = 0;
for(int i=1;i<=5;i++) gain += beki[fac_level[i]]*fac_num[i]*fac_gain[i];
return gain;
}
void reinforce_fac(int n){
fac_level[n]++; fac_reinforce_price[n] *= 10;
}
void buy_fac(int n){
fac_num[n]++; fac_price[n] = (fac_price[n]*6)/5;
}
ll is_purchase_good(int n,ll time){
return fac_gain[n]*(beki[fac_level[n]]*(N-time+1+(resF[time]*7))+resB[time]*(beki[fac_level[n]]+99)/100) - fac_price[n];
}
ll is_reinforcement_good(int n,ll time){
return fac_gain[n]*(beki[fac_level[n]+1]*fac_num[n]*(N-time+1+(resF[time]*7))+resB[time]*(beki[fac_level[n]+1]*fac_num[n]+99)/100) - fac_reinforce_price[n];
}
ll cost_performance_buy(int n){
return fac_price[n]/fac_gain[n];
}
ll cost_performance_reinforce(int n){
return fac_reinforce_price[n]/(fac_gain[n]*2*fac_num[n]);
}
int main(){
cin >> N >> S;
fac_num[0] = 1;
for(int i=1;i<=20;i++) beki[i] = 2*beki[i-1];
//cerr << is_purchase_good(5,10) << endl;
for(int i=N;i>=1;i--){
resB[i] = (S[i]=='B'); resB[i] += resB[i-1];
resF[i] = (S[i]=='F'); resF[i] += resF[i-1];
resS[i] = (S[i]=='S'); resS[i] += resS[i-1];
}
ll money = 0;
int aim = 10;
for(int i=1;i<=N;i++){
ll gain = 0,loss = 0;
if(aim!=-1 && aim<10 && fac_price[aim]<=money){
ans[i][0] = 2; ans[i][1] = aim;
loss = fac_price[aim]; buy_fac(aim);
ll mi = 1e9;
aim = -1;
for(int j=1;j<=5;j++){
if(mi > cost_performance_buy(j) && is_purchase_good(j,i+10)>0){
mi = cost_performance_buy(j); aim = j;
}
}
for(int j=0;j<=5;j++){
if(fac_num[j]==0) continue;
if(mi > cost_performance_reinforce(j) && is_reinforcement_good(j,i+10)>0){
mi = cost_performance_reinforce(j); aim = j+10;
}
}
// cerr << aim << endl;
}else if(aim>=10 && fac_reinforce_price[aim-10]<=money){
aim -= 10;
if(aim==0) ans[i][0] = 5;
else{ans[i][0] = 4; ans[i][1] = aim;}
loss = fac_reinforce_price[aim]; reinforce_fac(aim);
ll mi = 1e9;
aim = -1;
for(int j=1;j<=5;j++){
if(mi > cost_performance_buy(j) && is_purchase_good(j,i+10)>0){
mi = cost_performance_buy(j); aim = j;
}
}
for(int j=0;j<=5;j++){
if(fac_num[j]==0) continue;
if(mi > cost_performance_reinforce(j) && is_reinforcement_good(j,i+10)>0){
mi = cost_performance_reinforce(j); aim = j+10;
}
}
}else{
ans[i][0] = 1; gain++;
}
gain += gain_from_fac();
if(S[i-1]=='F') gain *= 7;
if(S[i-1]=='S'){loss *= 9; loss = (loss+9)/10;}
money += gain-loss;
if(S[i-1]=='B') money += (money+99)/100;
//cerr << money << " " << aim << endl;
//assert(money>=0);
}
for(int j=0;j<=5;j++){
cerr << fac_num[j] << " " << fac_level[j] << endl;
cerr << fac_price[j] << " " << fac_reinforce_price[j] << endl;
}
cerr << money << endl;
show();
}
sinsincoscos