问题一: 在一场考试中有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 abut这么直接返回不对!逻辑对了,但返回值不对。题目里说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)