1.弹珠堆放
小蓝有 20230610 颗磁力弹珠,他对金字塔形状尤其感兴趣,如下图所示:
高度为 1的金字塔需要 1 颗弹珠;
高度为 2 的金字塔需要 4 颗弹珠;
高度为 3 的金字塔需要 10 颗弹珠;
高度为 4的金字塔需要 20 颗弹珠。
小蓝想要知道用他手里的弹珠可以摆出的最高的金字塔的高度是多少?
思路
第n层都比n-1层多(n**2+n)//2个,正好为等差数列求和公式。
题目说是最高的金字塔的高度,则累加之后可以打印count,如果不足那一层则建议减一层。
代码
import os
import sys
# 请在此输入您的代码
n=20230610
count=0
for i in range(1,1000):
count+=(i**2+i)//2
if count>=n:
# print(count)
print(i-1)
break
2.划分
给定 40 个数,请将其任意划分成两组,每组至少一个元素。每组的权值为组内所有元素的和。划分的权值为两组权值的乘积。请问对于以下 40 个数,划分的权值最大为多少。
5160 9191 6410 4657 7492 1531 8854 1253 4520 9231
1266 4801 3484 4323 5070 1789 2744 5959 9426 4433
4404 5291 2470 8533 7608 2935 8922 5273 8364 8819
7374 8077 5336 8495 5602 6553 3548 5267 9150 3309
思路
利用基本不等式的思想,两组的权值接近(最好情况下相等),和定积最大,即为权值最大。
代码1
import os
import sys
# 请在此输入您的代码
nums = [5160, 9191, 6410, 4657, 7492, 1531, 8854, 1253, 4520, 9231,
1266, 4801, 3484, 4323, 5070, 1789, 2744, 5959, 9426, 4433,
4404, 5291, 2470, 8533, 7608, 2935, 8922, 5273, 8364, 8819,
7374, 8077, 5336, 8495, 5602, 6553, 3548, 5267, 9150, 3309]
print(sum(nums)//2 * (sum(nums) - sum(nums) // 2))
代码2
nums = [5160,9191,6410,4657,7492,1531,8854,1253,4520,9231,
1266,4801,3484,4323,5070,1789,2744,5959,9426,4433,
4404,5291,2470,8533,7608,2935,8922,5273,8364,8819,
7374,8077,5336,8495,5602,6553,3548,5267,9150,3309]
# 第一步:计算总和
total = sum(nums)
target = total // 2 # 理想目标值是总和的一半
# 第二步:动态规划找最接近目标的子集和
# dp[i]表示是否存在和为i的子集
dp = [False] * (target + 1)
dp[0] = True # 初始状态:和为0是存在的(空集)
for num in nums:
# 从后往前更新,避免重复使用同一个数字
for i in range(target, num-1, -1):
if dp[i - num]: # 如果i-num的组合存在
dp[i] = True # 那么i的组合也存在
# 第三步:找到最大的可行子集和
max_sum = 0
for i in range(target, 0, -1):
if dp[i]:
max_sum = i
break
# 第四步:计算乘积(最大和 × 剩余和)
print(max_sum * (total - max_sum))
3.偶串
小蓝特别喜欢偶数,当他看到字符串时,他总数要检查一下是不是每种字符都是出现偶数次。给定一个字符串,请帮助小蓝检查一下该字符串是否满足要求。
输入描述
输入一行包含一个字符串,由小写英文字母组成。
输出描述
如果字符串中的每种字符都是出现偶数次,输出大写英文单词 YES ,否则输出大写英文单词 NO。
样例输入
banana
样例输出
NO
样例输入
bbnana
样例输出
YES
代码1
import os
import sys
# 请在此输入您的代码
s=input()
lst=[]
for i in s:
lst.append(i)
result={}
for j in lst:
if result.get(j)==None:
result[j]=1
else:
result[j]+=1
all_even = all(value % 2 == 0 for value in result.values())
# print(all_even) # 如果所有值都是偶数,输出: True;否则输出: False
if all_even==True:
print("YES")
else:
print("NO")
代码2
ans = 0
for i in input():
ans ^= ord(i)
print("NO" if ans else "YES")
相关知识
异或操作:
每次异或操作相当于记录字符是否出现偶数次。如果一个字符出现偶数次,它的ASCII码值会被异或两次,结果为0;如果出现奇数次,结果为该字符的ASCII码值。
988

被折叠的 条评论
为什么被折叠?



