问题一:
在一场考试中有n道选择题,每道题目的答案都是A、B、C、D中的一个,现在汪仔知道自己做出的答案和朋友做出的答案,并且他还知道朋友总共做对了多少道题。现在他想知道自己最少做对了多少道题,最多做对了多少道题。
输入:4个参数
N,选择题总数
K,朋友作对的题数
STR1,长度为n只包含ABCD的字符串,其中第i个代表汪仔第i道题做出的选。
STR2,长度为n只包含ABCD的字符串,其中第i个代表朋友第i道题做出的选。
输出:
返回一个Interval对象,start代表汪仔最少做对了多少道题,end代表汪仔最多做对了多少道题。
示例:
输入
3,3,“ABC”, “ABC”
输出
[3,3]
说明
因为汪仔和朋友的答案一样,而朋友答案全部正确,所以汪仔的答案也全部正确。
输入
3,1,“ABC”, “DDD”
输出
[0,2]
说明
如果答案为BCD,那么汪仔一道题没做对,如果答案为ABD,那么汪仔做对了两道题,因为答案中有一个D,因此汪仔不可能做对三道题。
题解:
#逻辑推理题
from interval import Interval
class Solution:
def solve(self, n, k, str1, str2):
# write code here
# return Interval(3,3)
count = 0
for i in range(n):
if str1[i] == str2[i]:
count += 1
if count <= k:
start = count - (n-k)
end = count + (n-k)
else:
start = count
end = k + (n-count)
return Interval(start, end)
a = Interval()
a.start = 0
a.end = 5
return a
but这么直接返回不对!逻辑对了,但返回值不对。题目里说Interval已内置,直接调用就好,实际上Interval要自己先定义再调用,艹!
问题二:
甲乙两人在一个球堆中轮流取球,一次可以取走1~3个,甲先取。在每次取球后,裁判会等可能地从球堆中再取0-1个,刚好取完球的人获胜。如果再某人取完球之后,裁判从球堆中取球并将球数减少为0,那么也是该人的胜利。甲乙都是理性人,每个回合都会选择自己胜率最大的取法。设初始状态有N个球,求甲的胜利。
函数输入
输入:N 整数
输出:甲的胜率,浮点数[0,1],误差在万分之一内。但如果甲必输或必赢,则应严格地输出0或者1。
示例
输入
1
输出
1.00000
说明
当只有1个球时,甲会直接取走这个球,胜率为1
输入
4
输出
0.5
说明
当有4个球时,甲的最佳方案是取走3个球,剩一个球给裁判碰运气,胜率为0.5。甲的其他选择都是送分给乙。
题解:
class Solution:
def calcProb(self, n):
# write code here
dp = [0] * (n + 1)
if n < 4: return 1
dp[0] = 0
dp[1] = 1
dp[2] = 1
dp[3] = 1
for i in range(4, n + 1):
dp[i] = max((1 - (dp[i - 1] * 0.5 + dp[i- 2] * 0.5)),
(1 - (dp[i - 2] * 0.5 + dp[i - 3] * 0.5)),
(1 - (dp[i - 3] * 0.5 + dp[i - 4] * 0.5)))
#甲取1,2,3个球的情况
#print('第',i,dp[i])
return dp[n]
a = Solution()
#a.calcProb(4)
c= a.calcProb(20)
print(c)