結果
| 問題 |
No.5003 物理好きクリッカー
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-12-07 22:03:45 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 322 ms / 10,000 ms |
| コード長 | 3,982 bytes |
| コンパイル時間 | 1,333 ms |
| 実行使用メモリ | 21,984 KB |
| スコア | 269,915,111 |
| 平均クエリ数 | 10000.00 |
| 最終ジャッジ日時 | 2021-07-19 09:06:26 |
| 合計ジャッジ時間 | 13,956 ms |
|
ジャッジサーバーID (参考情報) |
judge10 / judge11 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 32 |
ソースコード
// C++11
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include "bits/stdc++.h"
#include <sys/time.h>
#include <emmintrin.h>
#include <string>
#include <bitset>
using namespace std;
inline long long GetTSC() {
long long lo, hi;
asm volatile ("rdtsc": "=a"(lo), "=d"(hi));
return lo + (hi << 32);
}
inline double GetSeconds() {
return GetTSC() / 2.8e9;
}
struct XorShift {
uint64_t x = 88172645463325252ULL;
XorShift() {}
void setSeed(uint64_t seed) { x = seed; }
uint64_t next() { x ^= x << 13; x ^= x >> 7; x ^= x << 17; return x; }
int nextInt(int n) {
uint64_t upper = 0xFFFFFFFFFFFFFFFFULL / n * n;
uint64_t v = next();
while (v >= upper) { v = next(); }
return v % n;
}
double nextDouble() {
uint64_t v = next() >> 11; // 53bit
return (double)v / (1ULL << 53);
}
};
const double TO = 9.9;
const double eps = 1e-7;
const double inf = 1e7;
const int N = 10000;
char S[N];
int R[N];
const int CLICK = 1;
const int FM = 6;
const string FS[FM] = {"enhclick", "hand", "lily", "factory", "casino", "grimoire"};
const int FP[FM] = {1, 1, 10, 120, 2000, 25000};
const int FB[FM] = {-1, 150, (int)2e3, (int)3e4, (int)6e5, (int)1e7};
const int FA[FM] = {15, 1500, (int)2e4, (int)3e5, (int)6e6, (int)1e8};
const int BUY = 2;
const int SELL = BUY + FM;
const int REF = BUY + FM * 2;
double starttime, gt;
int tt,ctt;
XorShift xs;
void init(){
int n;
scanf("%d%s", &n, S);
}
long calc_score(){
long r = 0;
return r;
}
void solve(){
long c = 0;
int bcount[FM] = {1, 0, 0, 0, 0, 0};
int acount[FM] = {0, 0, 0, 0, 0, 0};
long bcost[FM];
long acost[FM];
for(int i=0; i<FM; i++){
bcost[i] = FB[i];
acost[i] = FA[i];
}
bool sf = 0;
int ft = -1;
for(int t=0; t<N; t++){
int tr = CLICK;
if(t < N - 2000){
for(int i=FM-1; i>=0; i--){
long ac = acost[i];
long bc = bcost[i];
if(sf){
ac -= ac / 10;
bc -= bc / 10;
}
if(ac <= c){
tr = REF + i;
c -= ac;
acount[i]++;
acost[i] *= 10;
break;
}
if(i > 0 && bc <= c){
tr = BUY + i;
c -= bc;
bcount[i]++;
bcost[i] += bcost[i] / 5 + (bcost[i] % 5 ? 1 : 0);
break;
}
}
}
R[t] = tr;
long cc = 0;
if(tr == CLICK){
cc = bcount[0] * pow(2, acount[0]);
}
for(int i=1; i<FM; i++){
if(bcount[i] < 1) continue;
cc = bcount[i] * pow(2, acount[i]) * FP[i];
}
if(ft >= t){
cc *= 7;
}
if(t % 1000 == 999) cerr << t << ": " << c << ", cc: " << cc << endl;
sf = 0;
if(S[t] == 'N'){
}else if(S[t] == 'B'){
c += c / 100 + (c%100 ? 1 : 0);
}else if(S[t] == 'F'){
ft = t + 20;
}else if(S[t] == 'S'){
sf = 1;
}
c += cc;
}
for(int i=0; i<FM; i++){
cerr << "i: " << i << " bc: " << bcount[i] << " ac: " << acount[i] << endl;
}
cerr << "c: " << c << endl;
}
void output(){
int t = 0;
string s;
for(int i=0; i<N; i++){
int ri = R[i];
if(ri == CLICK){
cout << "click" << endl;
}else if(ri == REF){
cout << "enhclick" << endl;
}else if(ri >= BUY && ri < BUY + FM){
cout << "buy " << FS[ri - BUY] << endl;
}else if(ri >= REF && ri < REF + FM){
cout << "reinforce " << FS[ri - REF] << endl;
}else if(ri >= SELL && ri < SELL + FM){
cout << "sell " << FS[ri - SELL] << endl;
}
cin >> s;
if(i == 0) cerr << "s: " << s << endl;
if(s == "-3"){
cerr << 1 / t << endl;
}
if(s == "-1") return;
}
}
int main() {
srand((unsigned) time(NULL));
xs.setSeed(rand() % 65536 || 65537);
double mainstart = GetSeconds();
cerr << setprecision(10);
init();
cerr << "init_time: " << GetSeconds() - mainstart << endl;
solve();
output();
cerr << "main_time: " << GetSeconds() - mainstart << endl;
return 0;
}