結果

問題 No.5003 物理好きクリッカー
ユーザー butsurizukibutsurizuki
提出日時 2018-12-25 02:55:59
言語 C
(gcc 12.3.0)
結果
AC  
実行時間 9,334 ms / 10,000 ms
コード長 4,877 bytes
コンパイル時間 184 ms
実行使用メモリ 21,996 KB
スコア 903,653
平均クエリ数 10000.00
最終ジャッジ日時 2021-07-19 09:50:35
合計ジャッジ時間 310,016 ms
ジャッジサーバーID
(参考情報)
judge12 / judge15
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 9,305 ms
21,852 KB
testcase_01 AC 9,300 ms
21,516 KB
testcase_02 AC 9,319 ms
21,528 KB
testcase_03 AC 9,290 ms
21,504 KB
testcase_04 AC 9,278 ms
21,348 KB
testcase_05 AC 9,275 ms
21,864 KB
testcase_06 AC 9,289 ms
21,372 KB
testcase_07 AC 9,281 ms
21,876 KB
testcase_08 AC 9,278 ms
21,672 KB
testcase_09 AC 9,300 ms
21,900 KB
testcase_10 AC 9,285 ms
21,360 KB
testcase_11 AC 9,302 ms
21,492 KB
testcase_12 AC 9,301 ms
21,372 KB
testcase_13 AC 9,289 ms
21,372 KB
testcase_14 AC 9,276 ms
21,888 KB
testcase_15 AC 9,303 ms
21,360 KB
testcase_16 AC 9,302 ms
21,348 KB
testcase_17 AC 9,282 ms
21,360 KB
testcase_18 AC 9,271 ms
21,504 KB
testcase_19 AC 9,283 ms
21,912 KB
testcase_20 AC 9,298 ms
21,492 KB
testcase_21 AC 9,299 ms
21,360 KB
testcase_22 AC 9,279 ms
21,384 KB
testcase_23 AC 9,288 ms
21,360 KB
testcase_24 AC 9,283 ms
21,828 KB
testcase_25 AC 9,272 ms
21,912 KB
testcase_26 AC 9,271 ms
21,528 KB
testcase_27 AC 9,279 ms
21,348 KB
testcase_28 AC 9,280 ms
21,876 KB
testcase_29 AC 9,283 ms
21,840 KB
testcase_30 AC 9,334 ms
21,528 KB
testcase_31 AC 9,328 ms
21,528 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#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;
      for(i=0;i<16;i++){
        if(i==15){
          strcpy(cmd[i],"enhclick");
        }
        else{strcpy(cmd[i],"click");}
      }

      for(i=16;i<n;i++){
        if(xorshift()%25==0 && n<=7000){
          a=(xorshift()%5);
          if(a==0){a=3;}
          else if(a==1){a=4;}
          else{a=1;}
          strcpy(cmd[i],move[a]);
          if(a==1){c++;}
          if(a!=4){
            if(c==20){
              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;
}
0