#include #include #include #include #include #include #include #include using namespace std; typedef long long int ll; ll min(ll a, ll b){ if(a>b) return b; else return a; } int main(){ int n; char s[10010]; scanf("%d%s", &n, s); int comand[20000]; //クッキーの量と1ターンあたりの生産量(クリック含まず、含む) ll cooky = 0; ll pro = 1; ll clipro = 1; //現在の施設価格 ll click = 15; ll hand = 150; ll lily = 2000; ll factory = 30000; ll casino = 600000; ll grimoire = 10000000; //強化にかかるお金 ll rfgri = 100000000; ll enhcli = 15; //強化回数 int enhclitime = 0; int rfgritime = 0; //grimoireの数(強化した場合は2倍になる) int gritime = 0; //段階 int level = 0; //目標金額 ll amemoney; //目標金額上限 ll amemax = 500000000000; //目標金額下限 ll amemin = 0; int i = 0; while(i (enhcli-cooky)/clipro+lily/(clipro+pow(2,enhclitime))){ while(cooky < enhcli){ comand[i] = 0; i++; //cout << cooky << endl; cooky += clipro; } comand[i] = 11; i++; //cout << "ec " << i << endl; cooky -= enhcli; enhcli *= 10; clipro += pow(2,enhclitime); enhclitime++; cooky += pro; continue; } } //factoryがない段階 if(level==1){ //factoryを買って段階を上げる if((factory-cooky)/clipro <= factory/(clipro+10)+(lily-cooky)/clipro){ while(cooky < factory){ comand[i] = 0; i++; cooky += clipro; } comand[i] = 3; i++; cooky -= factory; factory = factory*6/5; clipro += 120; pro += 120; cooky += pro; level++; continue; } //lilyを買う if((factory-cooky)/clipro > factory/(clipro+10)+(lily-cooky)/clipro){ while(cooky < lily){ comand[i] = 0; i++; cooky += clipro; } comand[i] = 2; i++; cooky -= lily; if(lily%5 == 0){ lily = lily*6/5; } else{ lily = lily*6/5+1; } clipro += 10; pro += 10; cooky += pro; continue; } } //casinoがない段階 if(level==2){ //casinoを買って段階を上げる if((casino-cooky)/clipro <= casino/(clipro+120)+(factory-cooky)/clipro){ while(cooky < casino){ comand[i] = 0; i++; cooky += clipro; } comand[i] = 4; i++; cooky -= casino; casino = casino*6/5; clipro += 2000; pro += 2000; cooky += pro; level++; continue; } //factoryを買う if((casino-cooky)/clipro > casino/(clipro+120)+(factory-cooky)/clipro){ while(cooky < factory){ comand[i] = 0; i++; cooky += clipro; } comand[i] = 3; i++; cooky -= factory; if(factory%5 == 0){ factory = factory*6/5; } else{ factory = factory*6/5+1; } clipro += 120; pro += 120; cooky += pro; continue; } } //grimoireがない段階 if(level==3){ //grimoireを買って段階を上げる if((grimoire-cooky)/clipro <= grimoire/(clipro+2000)+(casino-cooky)/clipro){ while(cooky < grimoire){ comand[i] = 0; i++; cooky += clipro; } comand[i] = 5; i++; gritime++; cooky -= grimoire; grimoire = grimoire*6/5; clipro += 25000; pro += 25000; cooky += pro; level++; continue; } //factoryを買う if((grimoire-cooky)/clipro > grimoire/(clipro+2000)+(casino-cooky)/clipro){ while(cooky < casino){ comand[i] = 0; i++; cooky += clipro; } comand[i] = 4; i++; cooky -= casino; if(casino%5 == 0){ casino = casino*6/5; } else{ casino = casino*6/5+1; } clipro += 2000; pro += 2000; cooky += pro; continue; } } //全てそろった段階 if(level==4){ int j; //初期化用変数 ll nowcooky = cooky; ll nowrfgri = rfgri; int nowrfgritime = rfgritime; ll nowgrimoire = grimoire; int nowgritime = gritime; ll nowpro = pro; ll nowclipro = clipro; //二部探索で達成可能クッキー数を調べていく while(1){ if(amemax == amemin || amemax-1 == amemin){ //ここにちゃんとcomandを目標ameminにするやつを入れるか? break; } //初期化 j = i; cooky = nowcooky; rfgri = nowrfgri; rfgritime = nowrfgritime; grimoire = nowgrimoire; gritime = nowgritime; pro = nowpro; clipro = nowclipro; //二部探索 amemoney = (amemax+amemin)/2; while(1){ //目標クッキー数に挑戦 if((amemoney-cooky)/clipro <= min((rfgri-cooky)/clipro+amemoney/(clipro+gritime*25000), (grimoire-cooky)/clipro+amemoney/(clipro+25000))){ while(cooky < amemoney){ comand[j] = 0; j++; cooky += clipro; if(j==n) break; } if(j==n && cooky < amemoney){ amemax = amemoney; break; } amemin = amemoney; break; } //grimoire追加購入 if(rfgri/gritime >= grimoire){ while(cooky < grimoire){ comand[j] = 0; j++; cooky += clipro; if(j==n) break; } if(j==n-1 || j==n){ amemax = amemoney; break; } comand[j] = 5; j++; gritime += pow(2,rfgritime); cooky -= grimoire; if(grimoire%5==0){ grimoire = grimoire*6/5; } else{ grimoire = grimoire*6/5+1; } clipro += 25000*pow(2,rfgritime); pro += 25000*pow(2,rfgritime); cooky += pro; continue; } //grimoire強化 if(rfgri/gritime < grimoire){ while(cooky < rfgri){ comand[j] = 0; j++; cooky += clipro; if(j==n) break; } if(j==n-1 || j==n){ amemax = amemoney; break; } comand[j] = 16; j++; cooky -= rfgri; rfgri *= 10; rfgritime++; clipro += gritime*25000; pro += gritime*25000; gritime *= 2; cooky += pro; continue; } } } } break; } for(int i = 0; i < n; i++){ //コマンド列 if(comand[i]==-1){ printf("nothing\n"); } if(comand[i]==0){ printf("click\n"); } if(comand[i]==1){ printf("buy hand\n"); } if(comand[i]==2){ printf("buy lily\n"); } if(comand[i]==3){ printf("buy factory\n"); } if(comand[i]==4){ printf("buy casino\n"); } if(comand[i]==5){ printf("buy grimoire\n"); } if(comand[i]==6){ printf("sell hand\n"); } if(comand[i]==7){ printf("sell lily\n"); } if(comand[i]==8){ printf("sell factory\n"); } if(comand[i]==9){ printf("sell casino\n"); } if(comand[i]==10){ printf("sell grimoire\n"); } if(comand[i]==11){ printf("enhclick\n"); } if(comand[i]==12){ printf("reinforce hand\n"); } if(comand[i]==13){ printf("reinforce lily\n"); } if(comand[i]==14){ printf("reinforce factory\n"); } if(comand[i]==15){ printf("reinforce casino\n"); } if(comand[i]==16){ printf("reinforce grimoire\n"); } fflush(stdout); scanf("%s", s); } // printf("%d\n", gritime); // printf("%d\n", rfgritime); //cout << cooky << endl; return 0; }