[日本央行 27231,蟒蛇] 我为何期待 2023 年
解决《日本经济新闻》第 27231 期 "为什么我期待 2023 年 "问题的 Python 解决方案
问题链接
分类
暴力算法, 逆向追踪
描述
이미지를 불러올 수 없습니다.
很高兴看到我能够解决以前无法解决的问题,所以我觉得我进步了。
就拿这道题来说,最后一次尝试是在五个月前提交给比赛的,但在此期间我已经把解题思路写了好几遍。
之所以会有多次尝试,是因为只缺少一个条件,但我还是不清楚为什么缺少这个条件会超时。整理博客是最棒的!
让我来介绍一下解决问题的方法
对 *+ 符号之间的坐标进行位屏蔽,检查是否为整数
-
在不允许重复的列表中设置或排序
-
计数直到最初输入的数字(因为无论如何切分,都不会大于该数字),方格尺寸不断增大
这里我们遇到了一个问题。
对于一个由 0 和 1 组成的数字,我们应该输出 Hello, BOJ 2023!,因为如果我们把它分割成一个数字,那么无论平方多少次,数值都不会改变,但我只是排除了 1 的情况。
为了检查这一部分,我通过检查是否有大于 2 的单个数字来处理边缘情况,如果没有大于 2 的项,则打印 Hello, BOJ 2023!,这就是正确答案。
求解代码
# 2023년이 기대되는 이유
import sys
input = sys.stdin.readline
def pow_target(target_num: int, exponent: int) -> int:
result = 0
now_number = target_num
while now_number:
result += pow((now_number % 10), exponent)
now_number //= 10
return result
testcase = int(input())
result_dict = dict()
output = []
for _ in range(testcase):
target_number = input().rstrip('\n')
if result_dict.get(target_number) is not None:
output.append(result_dict[target_number])
else:
is_under_limit = True
for each_element in list(target_number):
if int(each_element) > 1:
is_under_limit = False
break
if is_under_limit:
result_dict[target_number] = 'Hello, BOJ 2023!'
output.append('Hello, BOJ 2023!')
continue
length = len(target_number)
check_list = []
check_list.append(int(target_number))
for i in range(1, 1 << length):
calc_result = 0
now_start = 0
now_end = 0
for j in range(length):
if i & (1 << j):
now_end = j
if now_end:
calc_result += int(target_number[now_start : now_end])
now_start = now_end
calc_result += int(target_number[now_start : length + 1])
if calc_result not in check_list:
check_list.append(calc_result)
else:
result = 0
check_amount = len(check_list)
check_list.sort()
max_value = check_list[-1]
pointer = 0
counter = 1
while pointer < check_amount:
now_result = pow_target(int(target_number), counter)
# 종료 조건 1
if now_result > max_value:
break
while pointer < check_amount and now_result > check_list[pointer]:
pointer += 1
# 종료 조건 2
if pointer >= check_amount:
break
if now_result == check_list[pointer]:
result += 1
counter += 1
result_dict[target_number] = result
output.append(result)
for result in output:
print(result)
댓글 작성
게시글에 대한 의견을 남겨 주세요.