我已经通过了示例输入,还有一些我决定打击的输入(即使是极端情况),但我不知道为什么我得到了"不正确。&#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);
}
答案 0 :(得分:1)
让我们来看看你想要解决的问题的逻辑。
您有两种选择:
目前您只添加了由newSize = (size * 2) - 1
代表的主题。每次有效地使(几乎)你的微尘大小加倍。
如果您的mote的新大小仍不足以捕获循环中当前j
次迭代所代表的微尘,该怎么办?您需要再次选择添加另一个微尘,或删除该微尘。
因此,假设您的微尘大小为2,其他微粒的大小为1, 1, 3, 5, 8, 1000, 1001
。您可以继续添加大量的微粒,直到您的微尘可以吸收1000
和1001
,或者您可以删除两个非常大的微粒。
有了这个启示,似乎迭代不会总是导致最佳答案。在每个步骤中,您做出的每个选择都是另一个可能可能保持答案的可能路径,但您希望找到导致最少操作量的决策路径。它好像你想要遵循所有可能的路径,然后从找到的最佳解决方案中选择。
幸运的是,网上有很多关于此的资源。我建议用Google搜索pathfinding
和pathfinding algorithms
。关于这个主题还有一点需要学习,但这一切都很有趣和有趣。
古德勒克!
答案 1 :(得分:0)
除了@ br3nt答案之外,我们可以考虑一下:
如果我要为您的算法添加简单贪婪解决方案,那么检查是否
if (sizes[j] < size) {
// ...
else {
deleteMote(j);
}
而deleteMote(j)
将完全按照其名称所暗示的那样完成并删除mote,只要需要多个步骤(添加一个mote)来增长到足以吃掉指数J处的微尘。
这可能不是完美的解决方案,但这是实现目标的第一步。