试题A:求和
- 题目:求1(含)至20230408(含)中的每个数的和
sum=0
for i in range(1,20230409):
sum+=i
print(sum)#204634714038436
试题B:分糖果
def dfs(x, a, b):#x表示第几个小朋友,a表示第一种糖果数量;b表示第二种糖果数量
global sum#计数
if x == 8:#当前为第8个小朋友
if a == 0 and b == 0:#两种糖果都分完了
# 如果七个人恰好分完则计数加一
sum += 1
return
for i in range(a + 1):
for j in range(b + 1):
if i + j >= 2 and i + j <= 5:
# 只有满足2-5的条件才可以
dfs(x + 1, a - i, b - j)
sum = 0
dfs(1, 9, 16)
print(sum)
试题C:三国游戏
题解:贪心
- 列举三个国家分别获胜的情况下,最大的事件数,取最大值
n = int(input())#读入n
a = list(map(int, input().split()))#读入Ai
b = list(map(int, input().split()))#读入Bi
c = list(map(int, input().split()))#读入Ci
def get(x, y, z):#在x获胜的情况下,最多发生多少个事件
t = [x[i] - y[i] - z[i] for i in range(n)]# 计算 x 获胜对结果的贡献
t.sort(reverse=True)# 将贡献按降序排序
for i in range(n):
t[i] += t[i - 1] if i > 0 else 0# 计算累积贡献和
if t[i] <= 0:# 返回在累积贡献和变为非正之前发生的事件数
return i
return n # 如果所有事件都可以发生,返回 n
res = max(get(a, b, c), get(b, a, c), get(c, a, b))# 计算每种获胜情况下的最大事件数,并选择最大值
print(-1 if res == 0 else res) # 打印结果(如果没有事件发生则为 -1,否则为最大事件数)
试题D:平均
题解
n = int(input()) # 输入数据组数
s = [[] for i in range(10)] # 创建一个长度为10的空列表,用于存储输入数据
for i in range(n):
a, b = map(int, input().split()) # 输入a和b
s[a].append(b) # 将b添加到对应索引的子列表中
for i in range(10):
s[i].sort() # 对每个子列表进行排序
res, c = 0, n // 10 # 初始化多余代价为0,计算每个子列表允许的最大长度
for i in range(10):
if len(s[i]) > c: # 如果子列表的长度超过允许长度
res += sum(s[i][:len(s[i]) - c]) # s[i]表示当前超过长度的子列表,总长度减去标准长度c等于要去掉的,统计排序号的当前列表要删去的值,并累加到多余代价中
print(res) # 输出多余代价
试题E:填充
题解
- 分析:先读入串,遍历串,每一个?都可以选择0/1,统计子串数并更新为较大的输出
s = input()
cnt = 0
i = 0
while i < len(s) - 1:
if s[i] == s[i + 1] or s[i] == '?' or s[i + 1] == '?':
cnt += 1#两个相邻字符相同总数加1
i += 2#由于要求互不重叠,当有相同字符时,直接移2步
else:#不相等的情况移一步
i += 1
print(cnt)
试题F:棋盘
题解:暴力
#用一个二维数组存棋盘,根据读入的坐标将对应的棋子取反
n,m=map(int,input().split())
#根据n生成一个全白的棋盘
x=[[0]*n for _ in range(n)]
#读入操作
for i in range(m):
a,b,c,d=map(int,input().split())
for j in range(a-1,c):
for k in range (b-1,d):
if x[j][k]==0:
x[j][k] = 1
else:
x[j][k] = 0
print(''.join(str(x) for x in x[0]))
print(''.join(str(x) for x in x[1]))
print(''.join(str(x) for x in x[2]))
题解:二维差分
n, m = map(int, input().split())
g = [[0] * (n + 2) for _ in range(n + 2)]#初始化二维差分数组
#构建二维差分数组
for _ in range(m):
x1, y1, x2, y2 = map(int, input().split())
g[x1][y1] += 1
g[x2 + 1][y1] -= 1
g[x1][y2 + 1] -= 1
g[x2 + 1][y2 + 1] += 1
#根据二维差分数组得到前缀和数组
for i in range(1, n + 1):
for j in range(1, n + 1):
g[i][j] += g[i - 1][j] + g[i][j - 1] - g[i - 1][j - 1]
for i in range(1, n + 1):
for j in range(1, n + 1):
if g[i][j] % 2==0:#如果操作次数为偶数,棋子为白
print(0, end="")
else:#如果操作次数为奇数,棋子为黑
print(1, end="")
print()
- 这个代码思路正确,换成其他语言为100分,由于python特性,时间超限,只有36分,没有找到100分代码,欢迎补充!
试题G:翻转
题解:模拟
- 坑点:#如果不判断前后相等,导致结果错误,具体原因尚未找到
n=int(input())
for _ in range(n):
t, s = input(), input() # 转成列表才能改
s = list(s)
n, ans = len(s), 0 # 字符串长度 答案
for i in range(n): # 遍历 s
if s[i] != t[i]: # 发现有跟 t 不一样的字符
if 0 < i < n - 1 and s[i - 1] != s[i] and s[i + 1] != s[i] and s[i - 1] == s[i + 1]:#如果不判断前后相等,导致结果错误
s[i] = t[i]
ans += 1
else: # 否则无解
ans = -1
break
print(ans)
试题H:异或和之差
试题H:小蓝的旅行计划