【问题标题】:Music Chairs problem implementation in C++音乐椅问题在 C++ 中的实现
【发布时间】:2021-12-19 11:39:59
【问题描述】:

我目前正在练习算法和 DS。我偶然发现了一个我无法弄清楚如何解决的问题。所以问题的链接是there:

总而言之,就是说有几把椅子围成一圈,人的位置(相对于某把椅子),他应该做多少M个动作。

所以输入如下:

3个整数 N, M, X , 椅子的数量, 男孩应该移动的次数和他将开始的第一把椅子( 1  ≤  X  ≤  N

那么,到目前为止我做了什么?我想到了以下几点:

所以我认为M移动后的相对位置是(x+m)%n,由于这会导致Integer溢出,所以我就这样做了,((x%n) + (m%n)) % n。我发现如果这个人已经到达椅子的最后一个索引,它将是 0,所以我处理了这个。但是,它只通过了 2 次测试。我不需要编写任何代码,我想以正确的思维方式进行指导。到目前为止,这是我的代码:

#include <iostream>

using namespace std;

int main() {

    long long n, m, x;

    cin >> n >> m >> x;



    // After each move, he reaches (X+1).

    // X, N chairs. 

    // ((X % N) + (M % N)) % N; 

    // Odd conideration.
    if ( m % 2 == 1) {
        m += 1;
    }

    long long position = (x % n + m % n) % n;
    if (position == 0) {
        position = n;
    }
    cout << position;

    return 0;
}

【问题讨论】:

  • (x+m) %n,既然这样会导致StackOverflow呢?你的意思是整数溢出吗?
  • @Scheff'sCat 对不起,我的意思是整数溢出。
  • 您知道负数% n 会导致负数吗? (不确定这是否相关......)
  • 感谢您的评论!这不是相对的,因为问题约束都是正数,我想过这个,但这不是相对的:)
  • 对于long long,不排除负数。 (我没有点击链接,你也没有在你的问题中提到这一点。)

标签: c++ algorithm data-structures


【解决方案1】:

问题来了:

假设N的值为2^63-1,X和M都是2^63 - 2。

当你的程序运行到((X % N) + (M % N)) % N 部分时, X%N 计算为 2^63 - 2(未更改),M%N 也是如此。 然后,两个结果相加:2^63 - 2 + 2^63 - 2,发生溢出。

【讨论】:

    【解决方案2】:

    如果问题需要特定的错误处理,它应该这样说明(所以不要难过)。

    在每个实际项目中,都应该有一个标准来规定如何处理奇怪的输入。你扔吗?你输出警告吗?如果有,是否需要翻译成系统语言?

    如果没有这样的说明,我会在阅读这些值后错误地排除这些值。向 std::cerr 打印错误(或抛出异常)。尽可能靠近阅读它们的位置执行此操作。
    对于溢出检测,您可以使用here 描述的方法。有些人可能不同意,对于实验室练习,这可能并不重要。但是,在计算“Garbage in == Garbage out”时有一种说法。在处理之前检查垃圾是一个好习惯,而不是在处理时尝试“回收”垃圾。

    【讨论】:

    • 谢谢,这真的很有帮助!
    【解决方案3】:

    在@WBuck 的评论之后,答案实际上很简单,就是将 long long 更改为 unsigned,因为没有负数,因此增加 long long 的 MAX VALUE(使用 unsigned 时)。

    非常感谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多