第十四届蓝桥杯大赛软件赛国赛Python大学B组


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码值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会有风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值