結果
| 問題 |
No.5003 物理好きクリッカー
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-12-25 04:05:23 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 9,323 ms / 10,000 ms |
| コード長 | 5,007 bytes |
| コンパイル時間 | 200 ms |
| 実行使用メモリ | 21,984 KB |
| スコア | 125,900,676,056 |
| 平均クエリ数 | 10000.00 |
| 最終ジャッジ日時 | 2021-07-19 09:50:49 |
| 合計ジャッジ時間 | 310,326 ms |
|
ジャッジサーバーID (参考情報) |
judge14 / judge15 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 32 |
ソースコード
#include<stdio.h>
#include<string.h>
#include<sys/time.h>
#define llinf 4154118101919364364
unsigned long long seed;
unsigned long long xorshift(){
seed=seed^(seed<<13);
seed=seed^(seed>>7);
seed=seed^(seed<<17);
return seed;
}
long long llceil(long long a,long long b){if(a%b==0){return a/b;}return (a/b)+1;}
char s[524288];
char move[8][16]={
"click",
"buy",
"sell",
"reinforce",
"enhclick",
"nothing"
};
char namebuild[8][16]={
"#",
"hand",
"lily",
"factory",
"casino",
"grimoire"
};
long long bvaluebuild[8]={
0,
150,
2000,
30000,
600000,
10000000
};
long long tvaluebuild[8][512]={0};
long long ismove(char str[]){
long long i;
for(i=0;i<=5;i++){
if(strcmp(move[i],str)==0){
return i;
}
}
return -1;
}
long long isbuild(char str[]){
long long i;
for(i=1;i<=5;i++){
if(strcmp(namebuild[i],str)==0){
return i;
}
}
return -1;
}
void calcvbuild(){
long long i,j,w;
for(i=1;i<8;i++){
for(j=1;j<512;j++){
tvaluebuild[i][j]=llinf;
}
tvaluebuild[i][1]=bvaluebuild[i];
for(j=2;j<512;j++){
w=llceil(6*tvaluebuild[i][j-1],5);
if(w>1000000000000000000){
break;
}
tvaluebuild[i][j]=w;
}
}
}
long long eval(char cmd[10005][16],char inbuild[10005][16]){
long long i,j,n=10000,r=0,ft=0,k=1,sf=0,id,ks,bp;
long long madebuild[8]={
1,
1,
10,
120,
2000,
25000
};
long long enhbuild[8]={
15,
1500,
20000,
300000,
6000000,
100000000
};
long long buildown[8]={
0,
0,
0,
0,
0,
0
};
for(i=0;i<n;i++){
if(ft==0){k=1;}else{k=7;}
if(strcmp(cmd[i],move[0])==0){
r+=(madebuild[0]*k);
}
else if(strcmp(cmd[i],move[1])==0){
id=isbuild(inbuild[i]);
if(id==-1){
}
else{
bp=tvaluebuild[id][buildown[id]+1];
if(sf==1){
bp=llceil(bp*9,10);
}
if(r<bp){
}
else{
r-=bp;
buildown[id]++;
}
}
}
else if(strcmp(cmd[i],move[2])==0){
id=isbuild(inbuild[i]);
if(id==-1){
}
else if(buildown[id]==0){
}
else{
bp=tvaluebuild[id][buildown[id]];
bp=llceil(bp,4);
r+=bp;
buildown[id]--;
}
}
else if(strcmp(cmd[i],move[3])==0){
id=isbuild(inbuild[i]);
if(id==-1){
}
else if(buildown[id]==0){
}
else{
ks=enhbuild[id];
if(sf==1){
ks=llceil(9*ks,10);
}
if(r>=ks){
r-=ks;
madebuild[id]*=2;
enhbuild[id]*=10;
}
else{
}
}
}
else if(strcmp(cmd[i],move[4])==0){
ks=enhbuild[0];
if(sf==1){
ks=llceil(9*ks,10);
}
if(r>=ks){
r-=ks;
madebuild[0]*=2;
enhbuild[0]*=10;
}
else{
}
}
else if(strcmp(cmd[i],move[5])==0){
}
else{
}
for(j=1;j<=5;j++){
r+=(madebuild[j]*buildown[j]*k);
}
if(ft>0){ft--;}
sf=0;
if(s[i]=='B'){
r+=llceil(r,100);
}
else if(s[i]=='F'){
ft=20;
}
else if(s[i]=='S'){
sf=1;
}
}
return r;
}
int main(void){
long stt,nt;
calcvbuild();
struct timeval tv;
gettimeofday(&tv, NULL);
seed=(tv.tv_sec*1000000+tv.tv_usec);
stt=seed;
long long i,j,n,m,k,a,b,c,h,w,r=0,l,t;
char dum[16];
char cmd[10005][16]={0};
char bcmd[10005][16]={0};
char inbuild[10005][16]={0};
char binbuild[10005][16]={0};
scanf("%lld%s",&n,s);
while(1){
h=1;c=0;k=2;
for(i=0;i<155;i++){
if(i==15 || i==95){
strcpy(cmd[i],"enhclick");
}
else if(i==129){
strcpy(cmd[i],"buy");
strcpy(inbuild[i],"hand");
}
else{strcpy(cmd[i],"click");}
}
for(i=155;i<n;i++){
if(xorshift()%25==0 && i<=7000){
a=(xorshift()%5);
if(a==0){a=3;}
else if(a==1 && k<6){a=4;k++;}
else{a=1;}
strcpy(cmd[i],move[a]);
if(a==1){c++;}
if(a!=4){
if(c==30){
if(h!=5){h++;}
c=0;
}
if(xorshift()%5!=0){
l=h;
}
else{
l=(xorshift()%5)+1;
}
strcpy(inbuild[i],namebuild[l]);
}
}
else{strcpy(cmd[i],"click");}
}
w=eval(cmd,inbuild);
if(r<w){
r=w;
for(i=0;i<n;i++){
strcpy(bcmd[i],cmd[i]);
strcpy(binbuild[i],inbuild[i]);
}
}
gettimeofday(&tv, NULL);
nt=(tv.tv_sec*1000000+tv.tv_usec);
if(nt-stt>9000000){break;}
}
for(i=0;i<n;i++){
printf("%s",bcmd[i]);
w=ismove(bcmd[i]);
if(1<=w && w<=3){
printf(" %s",binbuild[i]);
}
printf("\n");
fflush(stdout);
scanf("%s",dum);
}
return 0;
}