【问题标题】:Minimum number of steps to flip cards deck翻转卡片组的最小步骤数
【发布时间】:2015-07-18 01:56:30
【问题描述】:

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

鉴于N 牌面朝下,您必须将所有N 牌面朝上翻转。如果您正在翻转第 i 张卡片,则 i-1,i,i+1 将翻转。 例如:如果 N = 3,则最小步数将为 1。
给定 N 张卡片,我们必须计算翻转所有卡片的最小步骤数。

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

【问题讨论】:

标签: algorithm logic


【解决方案1】:

N=1、2 和 3 的情况很简单。

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

对于 N = 3k+1,首先翻转两端的两张牌,这会翻转 4 张牌。然后我们剩下 3k-3 张牌,可以被 3 整除,可以在 k-1 步中轻松翻转。

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

【讨论】:

  • 我无法获得 3K + 1。
  • 两个初始翻转 + k-1 = k+1
  • @Eduardo Leon : 在 N = 3K+1 的情况下,把两张牌都翻到最后,意味着第一张和最后一张应该翻,但是如果你翻最后一张牌,那么第一张牌也会再次翻转。
  • 我错了,忘记添加另一个条件,如果你翻第n张牌,那么n-1,n,1会被翻。
  • @vignesh: "如果你翻转第 n 张牌,那么 n-1, n, 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;

【讨论】:

  • 那么,(n + 2) / 3,然后呢?
  • (5 + 2) / 3 = 7 / 3 = 2
  • 漂亮,我什至不知道我以前的 cmets xd 在想什么,但不是 (n + 2) 而不是 (n + 3)?
  • 呃,是的,对不起,我粗心了。
  • @Emiliano Sorbello :是的,我了解您的解决方案。但我可以知道,它是如何工作的吗?例如,如果 N 是 4,那么最小没有步骤将是 2。如何完全翻转 4 张牌?你能解释一下吗?
【解决方案3】:
(N - (N % 3)) / 3 + (N % 3 ? 1 : 0)

我接受了 Higuaro 的评论,并且不再需要四舍五入。这个公式为您提供了 N 张牌的最小转数作为一个整数。

【讨论】:

    【解决方案4】:

    我以满分答对了。这是解决方案:-

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

    只需遍历组合直到 n=7 或 8,您就会弄清楚。这里的诀窍是将第 3 组翻转向下 - 以困难的方式计算出来,并且有点数学归纳法有所帮助。

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

    【讨论】:

    • 你完全正确。 (n + 2) / 3 或 N / 3 + (N % 3 ? 1 : 0) 将不起作用。
    猜你喜欢
    • 2014-02-25
    • 2014-01-15
    • 2019-02-05
    • 2017-04-03
    • 2022-11-15
    • 2013-07-03
    • 2021-02-19
    • 2013-11-22
    • 2015-06-05
    相关资源
    最近更新 更多