题目
对于正整数 n, 如果存在正整数 k 使得 2n=1+2+3+⋯+k=2k(k+1), 则 n 称为三角数。例如, 66066 是一个三角数, 因为6066=1+2+3+⋯+363 。
如果一个整数从左到右读出所有数位上的数字, 与从右到左读出所有数位 上的数字是一样的, 则称这个数为回文数。例如, 66066 是一个回文数, 8778 也是一个回文数。
如果一个整数 n 既是三角数又是回文数, 我们称它为三角回文数。例如 66066 是三角回文数。
请问, 第一个大于 20220514 的三角回文数是多少?
思路
我傻了 我以为题目是要找一个日期,不仅是三角数还是回文数。我就说怎么代码运行到最大的日期都没有满足条件的。
代码
import os
import sys
# 请在此输入您的代码
x = 0
for i in range(10000):
x += i # 这样得到的数一定是个三角数
if x>20220514 and str(x)[:] == str(x)[::-1]:
print(x)
break
题目
小蓝在玩一个寻宝游戏, 游戏在一条笔直的道路上进行, 道路被分成了 n 个方格, 依次编号 1 至 n, 每个方格上都有一个宝物, 宝物的分值是一个整数 (包括正数、负数和零), 当进入一个方格时即获得方格中宝物的分值。小蓝可 以获得的总分值是他从方格中获得的分值之和。
小蓝开始时站在方格 1 上并获得了方格 1 上宝物的分值, 他要经过若干步 到达方格 n。
当小蓝站在方格 p 上时, 他可以选择跳到p+1 到 p+D(n−p) 这些方格 中的一个, 其中D(1)=1,D(x)(x>1) 定义为 x 的最小质因数。
给定每个方格中宝物的分值, 请问小蓝能获得的最大总分值是多少。
思路
动态规划问题。首先先算出每个格子的D(x),从最后一个格子开始,看该格子之前的哪些格子能够跳到当前格子。选择值最大的一个进行递归。但是我代码写出来只能通过两个测试用例,呜呜 不知道为啥。
代码
import os
import sys
import math
# 请在此输入您的代码
n = int(input())
A = list(map(int, input().split()))
def get_D():
D = []
for i in range(n-1):
x = n - (i+1)
if x == 1:
D.append(1)
else:
temp = []
for j in range(2, x):
if math.gcd(x, j) != 1: # j为x的因数
temp.append(j)
temp.append(x) # 数本身也是一个因数
temp = list(set(temp)) # 去掉重复值
temp.sort() # 排序后就只需要找到第一个质数就能停止
for a in temp:
flag = True
for b in range(2, a):
if math.gcd(a, b) != 1: # 该数a不是质数
flag = False
break
if flag == True: # 找到第一个质数
D.append(a)
break
D.append(0) # 最后一位的D(x)为0
return D
D = get_D()
dict_A = {}
def dfs(x):
if x in dict_A.keys():
return dict_A[x]
else:
if x == 1:
return A[0]
else:
temp = []
for i in range(x-1):
if i+1+D[i] == x: # 能够到达当前方格的格子下标
temp.append(i+1)
temp.append(x-1) # 前一个格子必能到达后一个格子
temp = list(set(temp)) # 去掉重复值
max_deep = []
for y in temp:
max_deep.append(dfs(y))
v = max(max_deep) + A[x-1]
dict_A[x] = v
return v
print(dfs(n))