翻转牌组的最小步数

时间:2015-07-18 01:56:31

标签: algorithm logic

这是一个竞赛问题,而不是家庭作业。

鉴于N卡面朝下,您必须将所有N张卡翻转。如果你正在翻转ith卡,那么i-1,i,i + 1将会翻转。 例如:如果N = 3,则最小步数 1 鉴于N卡,我们必须计算翻转所有卡的最小步数。

最初我认为它是一种斐波纳契,让N = 2,3,4和最小步数Min = 1,1,4,但如果N = 6,那么最小步数将是 2 。我很震惊,有人可以帮忙吗?

4 个答案:

答案 0 :(得分:3)

N = 1,2和3的情况很容易。

对于N = 3k,这很容易。只需从第二张卡开始翻转k卡。

对于N = 3k + 1,首先翻转两端的卡片,翻转4张卡片。然后我们剩下3k-3卡,可以被3整除,可以很容易地以k-1的方式翻转。

对于N = 3k + 2,首先选择第一张牌,即翻转2张牌。现在你有3k卡要翻转,这很容易用k翻转。

答案 1 :(得分:2)

我回答了一个非常类似的问题here。乍一看这个问题似乎有些不同,但它完全一样。所以我在C代码中的答案是:

int min_steps(n){
    return (n / 3) + (n % 3 > 0); // So it's n/3 with multiples of 3
                                  // n/3 + 1 otherwise
}

编辑:如Eduardo León所述,它可以进一步缩小为:

    return (n + 2) / 3;

答案 2 :(得分:1)

(N - (N % 3)) / 3 + (N % 3 ? 1 : 0)

我已经采取了Higuaro的评论并且已经取消了回合的必要性。此公式为您提供N卡作为整数的最小转弯次数。

答案 3 :(得分:1)

我得到了正确的答案,得分很高。这是解决方案: -

if( n==1 || n ==2) return 1
else if( n%3 == 0) return n/3
else  return n

只需运行组合,直到n = 7或8,你就会弄明白。这里的诀窍是对第3组进行翻转 - 以艰难的方式解决它并且有一点数学归纳帮助。

注意: - 我尝试了所提到的其他解决方案,结果证明是错误的。