結果

問題 No.5003 物理好きクリッカー
ユーザー matsu7874
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import copy
import functools
import math
import sys
FACILITIES = {
'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'] * 10
return get_reinforce(name, num - 1) * 10
@functools.lru_cache(maxsize=None)
def get_productivity(name, num, reinforce):
return FACILITIES[name]['productivity'] * num * 2**reinforce
def 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) * 7
else:
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 -= price
facilities[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] -= 1
cookie += 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 -= price
reinforces[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 -= price
click_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 * 7
else:
cookie += total_productivity
#
special = specials[i]
if effect[1] <= 1:
effect = ['', 0]
else:
effect[1] -= 1
#
if special == 'N':
pass
elif 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 = cookie
for 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_cookies
def 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 = -1
for a in ACTIONS:
actions[i] = a
status = 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 = score
best_status[i + 1] = copy.deepcopy(status)
best_action = a
actions[i] = best_action[:]
return actions
def 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] += 1
if S[i] == 'F':
RIGHT_F[i] += 1
if S[i] == 'S':
RIGHT_S[i] += 1
RIGHT_B[i] += RIGHT_B[i + 1]
RIGHT_F[i] += RIGHT_F[i + 1]
RIGHT_S[i] += RIGHT_S[i + 1]
main()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0