Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Google CodeJam浴室暂停2017年资格赛大数据集错误_C#_Tree_Long Integer_Biginteger - Fatal编程技术网

C# Google CodeJam浴室暂停2017年资格赛大数据集错误

C# Google CodeJam浴室暂停2017年资格赛大数据集错误,c#,tree,long-integer,biginteger,C#,Tree,Long Integer,Biginteger,我正在尝试解决这个问题-解决方案在链接中提供,我下面的C代码在small1和2集合上非常有效。大的一组看起来解决得不错,但在线法官因不正确而失败。有人知道为什么吗?我尝试使用ulongs,我尝试检测溢出,我通过bruteforce与小集合进行比较,以找到相同的解决方案 private string SeatTreeSkip(ulong n, ulong k) { var q = new SortedSet<ulong>(); q.Add

我正在尝试解决这个问题-解决方案在链接中提供,我下面的C代码在small1和2集合上非常有效。大的一组看起来解决得不错,但在线法官因不正确而失败。有人知道为什么吗?我尝试使用
ulong
s,我尝试检测溢出,我通过bruteforce与小集合进行比较,以找到相同的解决方案

    private string SeatTreeSkip(ulong n, ulong k)
    {
        var q = new SortedSet<ulong>();
        q.Add(n);
        var c = new Dictionary<ulong,ulong>();
        c[n] = 1;
        for (ulong i = 0; i < n; )
        {
            ulong p = q.Last();
            ulong x0 = (ulong)Math.Ceiling((p - 1) / 2.0);
            ulong x1 = (ulong)Math.Floor((p - 1) / 2.0);
            if (p - 1 < 0)
                p = p;
            i += c[p];

            if (i < 0 || x0 < 0 || x1 < 0)
                throw new Exception("overflow");
            if (i >= k)
                return x0 + " " + x1;

            q.Remove(p);
            q.Add(x0);
            q.Add(x1);
            if (!c.ContainsKey(x0)) c.Add(x0, 0);
            if (!c.ContainsKey(x1)) c.Add(x1, 0);
            c[x0] += c[p];
            c[x1] += c[p];
        }
        throw new Exception("k is over");
    }
输出代码段:

4 2
5 2
6 2
1000 1000
1000 1
500000000000000000 249999999999999999
1000000000000000000 500000000000000000
999999999999999999 423539247696576511
3 2
500000000000000000 144115188075855872
1000000000000000000 1
Case #1: 1 0
Case #2: 1 0
Case #3: 1 1
Case #4: 0 0
Case #5: 500 499
Case #6: 1 0
Case #7: 1 0
Case #8: 1 1
Case #9: 0 0
Case #10: 1 1
Case #11: 500000000000000000 500000000000000000

正如@Jo在评论中所说,您对案例11的回答是不正确的(应该是:

Case#11:500000000000000000499999999999

)

我怀疑错误在您用于将整数拆分为子问题的公式中(当再次返回到
ulong
时,您可能会失去精度)

您可以通过避免浮点除以2.0并移动值来解决此问题。下面是我如何(用Python)解决它的:


正如@Jo在评论中所说,您对案例11的回答是不正确的(应该是:

Case#11:500000000000000000499999999999

)

我怀疑错误在您用于将整数拆分为子问题的公式中(当再次返回到
ulong
时,您可能会失去精度)

您可以通过避免浮点除以2.0并移动值来解决此问题。下面是我如何(用Python)解决它的:

看来案例5和案例11应该有类似的答案。为什么其中一个会有500 499,而另一个会有相同的数字?看起来案例5和案例11应该有相似的答案。为什么其中一个有500个499,而另一个有相同的数字?
def split(value):

    n = value >> 1

    return (n, n-1) if value % 2 == 0 else (n, n)