- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正试图从可容忍性中解决一个问题
"Even sums"
但是我做不到。这是下面的问题。
偶数是两个玩家的游戏。给玩家一个 N 个正整数的序列,并轮流轮流进行。在每一轮中,玩家选择一个非空切片(连续元素的子序列),使该切片中的值之和为偶数,然后移除该切片并连接序列的其余部分。第一个无法做出合法 Action 的玩家输掉了游戏。
你和你的对手玩这个游戏,你想知道你是否能赢,假设你和你的对手都玩得最好。你先动。
写一个函数:
string solution(vector< int>& A);
给定一个由 N 个整数组成的零索引数组 A,返回格式为“X,Y”的字符串,其中 X 和 Y 分别是您应该删除的切片的第一个和最后一个位置(含)假设你有一个获胜的策略,在你的第一步中获胜。如果有多个这样的获胜切片,则函数应返回具有最小 X 值的切片。如果有多个具有最小 X 值的切片,则函数应返回最短的切片。如果您没有制胜策略,该函数应返回“NO SOLUTION”。
例如,给定以下数组:
A[0] = 4 A[1] = 5 A[2] = 3 A[3] = 7 A[4] = 2
函数应该返回“1,2”。在从位置 1 到 2(具有偶数和 5 + 3 = 8)中删除一个切片后,剩下的数组是 [4, 7, 2]。然后对手将能够删除第一个元素(偶数和 4)或最后一个元素(偶数和 2)。之后你可以下一步让数组只包含 [7],这样你的对手就没有合法的下法并且会输。 following picture 上显示了一种可能的游戏
请注意,删除切片“2,3”(3 + 7 = 10 的偶数和)也是一个获胜步骤,但切片“1,2”的 X 值较小。
对于下面的数组:
A[0] = 2 A[ 1 ] = 5 A[2] = 4
该函数应返回“NO SOLUTION”,因为没有任何策略可以保证您获胜。
假设:
N为[1..100,000]范围内的整数;数组 A 的每个元素都是 [1..1,000,000,000] 范围内的整数。复杂性:
预期的最坏情况时间复杂度为 O(N);预期的最坏情况空间复杂度为 O(N),超出输入存储(不包括输入参数所需的存储)。可以修改输入数组的元素。我在 python 中找到了在线解决方案。
def check(start, end):
if start>end:
res = 'NO SOLUTION'
else:
res = str(start) + ',' + str(end)
return res
def trans( strr ):
if strr =='NO SOLUTION':
return (-1, -1)
else:
a, b = strr.split(',')
return ( int(a), int(b) )
def solution(A):
# write your code in Python 2.7
odd_list = [ ind for ind in range(len(A)) if A[ind]%2==1 ]
if len(odd_list)%2==0:
return check(0, len(A)-1)
odd_list = [-1] + odd_list + [len(A)]
res_cand = []
# the numbers at the either end of A are even
count = odd_list[1]
second_count = len(A)-1-odd_list[-2]
first_count = odd_list[2]-odd_list[1]-1
if second_count >= count:
res_cand.append( trans(check( odd_list[1]+1, len(A)-1-count )))
if first_count >= count:
res_cand.append( trans(check( odd_list[1]+count+1, len(A)-1 )))
twosum = first_count + second_count
if second_count < count <= twosum:
res_cand.append( trans(check( odd_list[1]+(first_count-(count-second_count))+1, odd_list[-2] )))
###########################################
count = len(A)-1-odd_list[-2]
first_count = odd_list[1]
second_count = odd_list[-2]-odd_list[-3]-1
if first_count >= count:
res_cand.append( trans(check( count, odd_list[-2]-1 )))
if second_count >= count:
res_cand.append( trans(check( 0, odd_list[-2]-count-1)) )
twosum = first_count + second_count
if second_count < count <= twosum:
res_cand.append( trans(check( count-second_count, odd_list[-3])) )
res_cand = sorted( res_cand, key=lambda x: (-x[0],-x[1]) )
cur = (-1, -2)
for item in res_cand:
if item[0]!=-1:
cur = item
return check( cur[0], cur[1] )
此代码有效,但我无法理解一个函数到另一个函数的代码和流程。但是我不明白算法的逻辑。它是如何处理并解决问题的。这可能是一项漫长的任务,但任何人都可以足够关心地向我解释算法。提前致谢。
最佳答案
到目前为止,我发现奇数的数量对于找出结果至关重要。尤其需要第一个奇数和最后一个奇数的索引来计算重要值。
现在我需要了解比较背后的逻辑,例如“if first_count >= count”和“second_count < count <= twosum”。
更新:大家好,我找到了问题的解决方案,终于理解了算法的逻辑。
这个想法在于数组的对称性。如果阵列是对称的,我们永远无法赢得比赛。这里对称的定义是这样的数组,中间只有一个奇数,奇数两边的偶数相等。
如果赔率为偶数,我们可以直接赢得比赛。
如果赔率是奇数,我们应该始终尝试使数组对称。这就是算法试图做的事情。
现在有两种情况。要么保留最后一个赔率,要么保留第一个赔率。如果你们不明白,我会很乐意解释更多。谢谢。
关于algorithm - 算法背后的逻辑是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38626231/
我在一本书(Interview Question)中读到这个问题,想在这里详细讨论这个问题。请点亮它。 问题如下:- 隐私和匿名化 马萨诸塞州集团保险委员会早在 1990 年代中期就有一个绝妙的主意
我最近接受了一次面试,面试官给了我一些伪代码并提出了相关问题。不幸的是,由于准备不足,我无法回答他的问题。由于时间关系,我无法向他请教该问题的解决方案。如果有人可以指导我并帮助我理解问题,以便我可以改
这是我的代码 public int getDist(Node root, int value) { if (root == null && value !=0) return
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我想学习一些关于分布式算法的知识,所以我正在寻找任何书籍推荐。我对理论书籍更感兴趣,因为实现只是个人喜好问题(我可能会使用 erlang(或 c#))。但另一方面,我不想对算法进行原始的数学分析。只是
我想知道你们中有多少人实现了计算机科学的“ classical algorithms ”,例如 Dijkstra's algorithm或现实世界中的数据结构(例如二叉搜索树),而不是学术项目? 当有
我正在解决旧编程竞赛中的一些示例问题。在这个问题中,我们得到了我们有多少调酒师以及他们知道哪些食谱的信息。制作每杯鸡尾酒需要 1 分钟,我们需要使用所有调酒师计算是否可以在 5 分钟内完成订单。 解决
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我开始学习 Nodejs,但我被困在中间的某个地方。我从 npm 安装了一个新库,它是 express -jwt ,它在运行后显示某种错误。附上代码和错误日志,请帮助我! const jwt = re
我有一个证书,其中签名算法显示“sha256rsa”,但指纹算法显示“sha1”。我的证书 SHA1/SHA2 的标识是什么? 谢谢! 最佳答案 TL;TR:签名和指纹是完全不同的东西。对于证书的强度
我目前在我的大学学习数据结构类(class),并且在之前的类(class)中做过一些算法分析,但这是我在之前的类(class)中遇到的最困难的部分。我们现在将在我的数据结构类(class)中学习算法分
有一个由 N 个 1x1 方格组成的区域,并且该区域的所有部分都是相连的(没有任何方格无法到达的方格)。 下面是一些面积的例子。 我想在这个区域中选择一些方块,并且两个相邻的方块不能一起选择(对角接触
我有一些多边形形状的点列表,我想将其包含在我页面上的 Google map 中。 我已经从原始数据中删除了尽可能多的不必要的多边形,现在我剩下大约 12 个,但它们非常详细以至于导致了问题。现在我的文
我目前正在实现 Marching Squares用于计算等高线曲线,我对此处提到的位移位的使用有疑问 Compose the 4 bits at the corners of the cell to
我正在尝试针对给定算法的约束满足问题实现此递归回溯函数: function BACKTRACKING-SEARCH(csp) returns solution/failure return R
是否有包含反函数的库? 作为项目的一部分,我目前正在研究测向算法。我正在使用巴特利特相关性。在 Bartlett 相关性中,我需要将已经是 3 次矩阵乘法(包括 Hermitian 转置)的分子除以作
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
问题的链接是UVA - 1394 : And There Was One . 朴素的算法是扫描整个数组并在每次迭代中标记第 k 个元素并在最后停止:这需要 O(n^2) 时间。 我搜索了一种替代算法并
COM 中创建 GUID 的函数 (CoCreateGUID) 使用“分散唯一性算法”,但我的问题是,它是什么? 谁能解释一下? 最佳答案 一种生成 ID 的方法,该 ID 具有一定的唯一性保证,而不
在做一个项目时我遇到了这个问题,我将在这个问题的实际领域之外重新措辞(我想我可以谈论烟花的口径和形状,但这会使理解更加复杂).我正在寻找一种(可能是近似的)算法来解决它。 我有 n 个不同大小的容器,
我是一名优秀的程序员,十分优秀!