【发布时间】:2018-04-13 07:18:49
【问题描述】:
这是 2015 年 ICPC 西北编程竞赛的问题之一,我想知道是否有更简单或更有效的方法。
问题来了:
“弗雷德喜欢穿不匹配的袜子。这有时意味着他必须提前计划。 假设他的袜子抽屉里有一只红色、一只蓝色和两只绿色的袜子。如果他穿着 红色配蓝色,他一直穿着相配的绿色袜子。他把两个放在一起 如果他将红色与绿色配对,然后将蓝色与绿色配对,则配对不匹配。鉴于 他袜子抽屉里的东西,他能放多少双不匹配的袜子?”
这是一个示例输入:
Color 1 -> 4 socks
Color 2 -> 3 socks
Color 3 -> 7 socks
Color 4 -> 11 socks
Color 5 -> 4 socks
我的做法是首先将输入读入一个数组并逐步对其进行排序。这样,我将在数组末尾拥有最多数量的袜子。从这里我基本上比较arr[i] 和arr[i-1] 并得到它们之间的最小值。将其添加到总数中,保存剩余部分,然后重复沿数组向下的过程。例如,使用示例输入,它看起来像这样:
排序后的数组:[3,4,4,7,11]
1:3 socks---> 1:3 socks---> 1:0 socks---> 1:0 socks
2:4 socks---> 2:4 socks---> 2:1 socks---> 2:1 socks
3:4 socks---> 3:4 socks---> 3:0 socks---> 3:0 socks
4:7 socks---> 4:0 socks---> 4:0 socks---> 4:0 socks
5:11 socks---> 5:4 socks---> 5:0 socks---> 5:0 socks
------> 总共 = 14 种可能的不匹配袜子组合。这似乎太天真了。有人对如何优化它有任何想法吗?如有必要,我可以发布我的代码。
【问题讨论】:
-
我认为这种方法不正确,因为您没有从最高计数中减去最低计数。考虑
1, 20, 80, 81- 在第一次迭代之后你会得到1, 20, 0, 1并且无法对 20 做很多事情,并得到答案 82 剩下 18 只袜子(正确答案应该是 91 没有剩下袜子)。 -
@Brendan,这是不正确的。在您给出的示例中,答案是 82,其余 18 只袜子的颜色都相同,因此它们不计入总数的一部分。还是我理解错了?
-
哦。我的方法也不对。为了正确答案;第一次迭代后可能是
0, 20, 80, 80,第二次迭代后可能是0, 10, 70, 80,第三次迭代后可能是0, 0, 70, 70。
标签: algorithm optimization combinatorics