我的Google Code Jam Round 1B 2013和#34; Osmos"?的代码有什么问题?

时间:2016-04-27 01:22:33

标签: java algorithm

我已经通过了示例输入,还有一些我决定打击的输入(即使是极端情况),但我不知道为什么我得到了"不正确。&#34 ;另外,忽略quickSort()电话,我已经实施了它,它运行正常。如果您需要概述,请在此处找到问题的链接:https://code.google.com/codejam/contest/2434486/dashboard#s=p0&a=0 我甚至查看了社论,但我不知道我错过了什么。

Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    for (int i = 0; i < t; i++) {
        int size = in.nextInt();
        int n = in.nextInt();
        int ops = 0;
        int[] sizes = new int[n];
        for (int j = 0; j < n; j++) {
            sizes[j] = in.nextInt();
        }
        quickSort(sizes);
        for (int j = 0; j < n; j++) {
            if (sizes[j] < size) {
                size += sizes[j];
            } else {
                int newSize = (size * 2) - 1;
                if (sizes[j] < newSize) {
                    size = newSize;
                }
                ops++;
            }
        }
        System.out.println("Case #" + (i + 1) + ": " + ops);
    }

2 个答案:

答案 0 :(得分:1)

让我们来看看你想要解决的问题的逻辑。

您有两种选择:

  • 删除微尘
  • 添加微尘

目前您只添加了由newSize = (size * 2) - 1代表的主题。每次有效地使(几乎)你的微尘大小加倍。

如果您的mote的新大小仍不足以捕获循环中当前j次迭代所代表的微尘,该怎么办?您需要再次选择添加另一个微尘,或删除该微尘。

因此,假设您的微尘大小为2,其他微粒的大小为1, 1, 3, 5, 8, 1000, 1001。您可以继续添加大量的微粒,直到您的微尘可以吸收10001001,或者您可以删除两个非常大的微粒。

有了这个启示,似乎迭代不会总是导致最佳答案。在每个步骤中,您做出的每个选择都是另一个可能可能保持答案的可能路径,但您希望找到导致最少操作量的决策路径。它好像你想要遵循所有可能的路径,然后从找到的最佳解决方案中选择。

幸运的是,网上有很多关于此的资源。我建议用Google搜索pathfindingpathfinding algorithms。关于这个主题还有一点需要学习,但这一切都很有趣和有趣。

古德勒克!

答案 1 :(得分:0)

除了@ br3nt答案之外,我们可以考虑一下:

如果我要为您的算法添加简单贪婪解决方案,那么检查是否

if (sizes[j] < size) {
    // ...
else {
    deleteMote(j);
} 

deleteMote(j)将完全按照其名称所暗示的那样完成并删除mote,只要需要多个步骤(添加一个mote)来增长到足以吃掉指数J处的微尘。

这可能不是完美的解决方案,但这是实现目标的第一步。