結果
問題 | No.5003 物理好きクリッカー |
ユーザー |
![]() |
提出日時 | 2018-12-01 04:26:24 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 5,094 ms / 10,000 ms |
コード長 | 6,876 bytes |
コンパイル時間 | 63 ms |
実行使用メモリ | 33,348 KB |
スコア | 50,169,623,761 |
平均クエリ数 | 10000.00 |
最終ジャッジ日時 | 2021-07-19 07:30:29 |
合計ジャッジ時間 | 168,344 ms |
ジャッジサーバーID (参考情報) |
judge10 / judge12 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 32 |
ソースコード
import copyimport functoolsimport mathimport sysFACILITIES = {'click': {'name': 'click','productivity': 1,'price': 1.5,},'hand': {'name': 'hand','productivity': 1,'price': 150,},'lily': {'name': 'lily','productivity': 10,'price': 2000,},'factory': {'name': 'factory','productivity': 120,'price': 30000,},'casino': {'name': 'casino','productivity': 2000,'price': 600000,},'grimoire': {'name': 'grimoire','productivity': 25000,'price': 10000000,},}FACILITY_NAMES = ['hand','lily','factory','casino','grimoire',]ACTIONS = [['click'],['buy', 'hand'],['buy', 'lily'],['buy', 'factory'],['buy', 'casino'],['buy', 'grimoire'],['sell', 'hand'],['sell', 'lily'],['sell', 'factory'],['sell', 'casino'],['sell', 'grimoire'],['reinforce', 'hand'],['reinforce', 'lily'],['reinforce', 'factory'],['reinforce', 'casino'],['reinforce', 'grimoire'],['enhclick'],]@functools.lru_cache(maxsize=None)def get_price(name, num):if num == 0:return FACILITIES[name]['price']return math.ceil(1.2 * get_price(name, num - 1))@functools.lru_cache(maxsize=None)def get_reinforce(name, num):if num == 0:return FACILITIES[name]['price'] * 10return get_reinforce(name, num - 1) * 10@functools.lru_cache(maxsize=None)def get_productivity(name, num, reinforce):return FACILITIES[name]['productivity'] * num * 2**reinforcedef simulate(s, t, actions, specials, facilities=None, reinforces=None, click_enhance=0, cookie=0, effect=None):if facilities is None:facilities = {name: 0 for name in FACILITY_NAMES}if reinforces is None:reinforces = {name: 0 for name in FACILITY_NAMES}if effect is None:effect = ['', 0]for i in range(s, t):# 行動フェーズcommand = actions[i][0]if command == 'click':if effect[0] == 'F':cookie += get_productivity('click', 1, click_enhance) * 7else:cookie += get_productivity('click', 1, click_enhance)elif command == 'buy':name = actions[i][1]price = get_price(name, facilities[name])if effect[0] == 'S':price = math.ceil(price * 0.9)if cookie >= price:cookie -= pricefacilities[name] += 1# else:# print(i, actions[i], 'cookie < price', file=sys.stderr)elif command == 'sell':name = actions[i][1]if facilities[name] > 0:facilities[name] -= 1cookie += math.ceil(get_price(name, facilities[name]) * 0.25)# else:# print(i, actions[i], 'cookie < price', file=sys.stderr)elif command == 'reinforce':name = actions[i][1]price = get_reinforce(name, reinforces[name])if effect[0] == 'S':price = math.ceil(price * 0.9)if cookie >= price:cookie -= pricereinforces[name] += 1# else:# print(i, actions[i], 'cookie < price', file=sys.stderr)elif command == 'enhclick':name = 'click'price = get_reinforce(name, click_enhance)if effect[0] == 'S':price = math.ceil(price * 0.9)if cookie >= price:cookie -= priceclick_enhance += 1# else:# print(i, actions[i], 'cookie < price', file=sys.stderr)# 施設によるクッキーの生産total_productivity = sum(get_productivity(name, facilities[name], reinforces[name]) for name in FACILITY_NAMES)if effect[0] == 'F':cookie += total_productivity * 7else:cookie += total_productivity# 特殊効果のカウントを減少special = specials[i]if effect[1] <= 1:effect = ['', 0]else:effect[1] -= 1# 特殊効果フェーズif special == 'N':passelif special == 'B':cookie += math.ceil(cookie * 0.1)elif special == 'F':effect = ['F', 20]elif special == 'S':effect = ['S', 1]return {'facilities': facilities,'reinforces': reinforces,'click_enhance': click_enhance,'cookie': cookie,'effect': effect,}def get_score(n, now, right_b, right_f, right_s, facilities, reinforces, click_enhance, cookie, effect):total_cookies = cookiefor name in FACILITY_NAMES:productivity = get_productivity(name, facilities[name], reinforces[name])# TODO: B, S, Fも考慮に入れるtotal_cookies += productivity * (n - now + 1 + right_f[now] * 19)return total_cookiesdef solve(n, s):actions = ['click' for i in range(n)]best_status = [None for i in range(n + 1)]facilities = {name: 0 for name in FACILITY_NAMES}reinforces = {name: 0 for name in FACILITY_NAMES}effect = ['', 0]best_status[0] = {'facilities': facilities,'reinforces': reinforces,'click_enhance': 0,'cookie': 0,'effect': effect,}for i in range(0, n):max_score = -1for a in ACTIONS:actions[i] = astatus = simulate(i, i + 1, actions, s, **copy.deepcopy(best_status[i]))score = get_score(n, i, RIGHT_B, RIGHT_F, RIGHT_S,status['facilities'], status['reinforces'], status['click_enhance'], status['cookie'], status['effect'])if score > max_score:max_score = scorebest_status[i + 1] = copy.deepcopy(status)best_action = aactions[i] = best_action[:]return actionsdef main():actions = solve(N, S)for action in actions:print(' '.join(action), flush=True)# result = input()if __name__ == "__main__":N = int(input())S = [c for c in input()]RIGHT_B = [0 for i in range(N + 1)]RIGHT_F = [0 for i in range(N + 1)]RIGHT_S = [0 for i in range(N + 1)]for i in range(N - 1, -1, -1):if S[i] == 'B':RIGHT_B[i] += 1if S[i] == 'F':RIGHT_F[i] += 1if S[i] == 'S':RIGHT_S[i] += 1RIGHT_B[i] += RIGHT_B[i + 1]RIGHT_F[i] += RIGHT_F[i + 1]RIGHT_S[i] += RIGHT_S[i + 1]main()