Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
String CodeJam 2014:中继器解决方案_String_Algorithm - Fatal编程技术网

String CodeJam 2014:中继器解决方案

String CodeJam 2014:中继器解决方案,string,algorithm,String,Algorithm,我参与了代码阻塞,我成功地解决了小的输入问题,但似乎无法找出多个字符串的方法 任何人都可以给出用于多个字符串的算法。对于2个字符串的小输入,我将逐个字符比较字符串,并进行操作以使它们相等。然而,这种方法会因大量输入而超时 有人能解释一下他们使用的算法吗。我可以看到其他用户的解决方案,但无法弄清楚他们做了什么。我可以告诉您我的解决方案,该解决方案适用于小型和大型输入。 首先,我们必须看看是否有解决方案,您可以通过将所有字符串转换为最简单的形式来实现这一点。如果其中任何一个不匹配,则没有解决方案 e

我参与了代码阻塞,我成功地解决了小的输入问题,但似乎无法找出多个字符串的方法

任何人都可以给出用于多个字符串的算法。对于2个字符串的小输入,我将逐个字符比较字符串,并进行操作以使它们相等。然而,这种方法会因大量输入而超时


有人能解释一下他们使用的算法吗。我可以看到其他用户的解决方案,但无法弄清楚他们做了什么。

我可以告诉您我的解决方案,该解决方案适用于小型和大型输入。 首先,我们必须看看是否有解决方案,您可以通过将所有字符串转换为最简单的形式来实现这一点。如果其中任何一个不匹配,则没有解决方案

e、 g

如果只给出前两个,那么解决方案是可能的。一旦第三个被扔进混合物,那就不可能了。进行简化的算法是解析字符串并消除您看到的任何双字符。一旦字符串不等于批处理的简化形式,就退出

至于问题的实际解决方案,我只是将字符串转换为[letter,repeat]格式。比如说

qwerty => 1q,1w,1e,1r,1t,1y
qqqwweeertttyy => 3q,2w,3e,1r,3t,2y
1a, 1a, 1a => 0 diff
1a, 2a, 2a => 1 diff
1a, 3a, 10a => 9 diff (to bring everything to 3)
请注意,输出是内部结构,而不是实际的字符串

想象一下,现在您有100个字符串,您已经通过了有解决方案的测试,并且您已经将所有字符串放入[letter,repeat]表示中。现在检查每个字母,找出重复次数的最小“差异”,以达到相同的数字。比如说

qwerty => 1q,1w,1e,1r,1t,1y
qqqwweeertttyy => 3q,2w,3e,1r,3t,2y
1a, 1a, 1a => 0 diff
1a, 2a, 2a => 1 diff
1a, 3a, 10a => 9 diff (to bring everything to 3)
要做到这一点,我很确定有一种更有效的方法是从最小数到最大数,然后计算所有微分的总和。您不能保证该数字将是集合中的一个数字。对于最后一个示例,您将计算差异,使所有值均为1 0,2,9=11,然后对于2 1,1,8=10,对于3 2,0,7=9,依此类推,直到10,然后再次选择最小值。字符串限制为1000个字符,因此这是一个简单的计算。在我的笔记本电脑上,结果是立竿见影的


对字符串中的每个字母重复相同的步骤,并对所有内容进行总结,这就是您的解决方案。

我可以告诉您我的解决方案,该解决方案适用于大小输入。 首先,我们必须看看是否有解决方案,您可以通过将所有字符串转换为最简单的形式来实现这一点。如果其中任何一个不匹配,则没有解决方案

e、 g

如果只给出前两个,那么解决方案是可能的。一旦第三个被扔进混合物,那就不可能了。进行简化的算法是解析字符串并消除您看到的任何双字符。一旦字符串不等于批处理的简化形式,就退出

至于问题的实际解决方案,我只是将字符串转换为[letter,repeat]格式。比如说

qwerty => 1q,1w,1e,1r,1t,1y
qqqwweeertttyy => 3q,2w,3e,1r,3t,2y
1a, 1a, 1a => 0 diff
1a, 2a, 2a => 1 diff
1a, 3a, 10a => 9 diff (to bring everything to 3)
请注意,输出是内部结构,而不是实际的字符串

想象一下,现在您有100个字符串,您已经通过了有解决方案的测试,并且您已经将所有字符串放入[letter,repeat]表示中。现在检查每个字母,找出重复次数的最小“差异”,以达到相同的数字。比如说

qwerty => 1q,1w,1e,1r,1t,1y
qqqwweeertttyy => 3q,2w,3e,1r,3t,2y
1a, 1a, 1a => 0 diff
1a, 2a, 2a => 1 diff
1a, 3a, 10a => 9 diff (to bring everything to 3)
要做到这一点,我很确定有一种更有效的方法是从最小数到最大数,然后计算所有微分的总和。您不能保证该数字将是集合中的一个数字。对于最后一个示例,您将计算差异,使所有值均为1 0,2,9=11,然后对于2 1,1,8=10,对于3 2,0,7=9,依此类推,直到10,然后再次选择最小值。字符串限制为1000个字符,因此这是一个简单的计算。在我的笔记本电脑上,结果是立竿见影的


对字符串中的每个字母重复相同的步骤,并对所有内容进行总结,这就是您的解决方案。

因为Thanasis已经解释了解决方案,所以我在这里提供了我的Ruby源代码。它真的很短,只有400B,并且完全遵循他的算法

def solve(strs)
    form = strs.first.squeeze
    strs.map { |str|
        return 'Fegla Won' if form != str.squeeze
        str.chars.chunk { |c| c }.map { |arr|
            arr.last.size
        }
    }.transpose.map { |row|
        Range.new(*row.minmax).map { |n|
            row.map { |r|
                (r - n).abs
            }.reduce :+
        }.min
    }.reduce :+
end

gets.to_i.times { |i|
    result = solve gets.to_i.times.map { gets.chomp }
    puts "Case ##{i+1}: #{result}"
}
它使用了一种压缩字符串的方法,可以删除所有重复的字符。这样,您只需将每个压缩行与引用变量形式进行比较。如果有不一致之处,您只需返回Fegla赢得的


接下来,在char数组上使用chunk方法,该方法收集所有连续字符。这样你可以很容易地数到它们

因为Thanasis已经解释了解决方案,所以我在这里提供了我的Ruby源代码。它真的很短,只有400B,并且完全遵循他的算法

def solve(strs)
    form = strs.first.squeeze
    strs.map { |str|
        return 'Fegla Won' if form != str.squeeze
        str.chars.chunk { |c| c }.map { |arr|
            arr.last.size
        }
    }.transpose.map { |row|
        Range.new(*row.minmax).map { |n|
            row.map { |r|
                (r - n).abs
            }.reduce :+
        }.min
    }.reduce :+
end

gets.to_i.times { |i|
    result = solve gets.to_i.times.map { gets.chomp }
    puts "Case ##{i+1}: #{result}"
}
它使用了一种压缩字符串的方法,可以删除所有重复的字符。这样,您只需将每个压缩行与引用变量形式进行比较。如果有不一致之处,您只需返回Fegla赢得的

接下来,在char数组上使用chunk方法,该方法收集所有连续字符。这样你可以很容易地数到它们

这个答案给出了一个例子来解释为什么找到中位数的重复次数会产生最低的成本

假设我们有价值观:

1 20 30 40 100
我们试图找到与所有这些值的总距离最短的值

我们可能猜测最好的答案是50,成本为50-1++50-20++50-30++50-40++50-100=159

将其分为两部分,左边和右边,左边是目标左边所有数字的成本,右边是右边所有数字的成本

left = |50-1|+|50-20|+|50-30|+|50-40| = 50-1+50-20+50-30+50-40 = 109
right = |50-100| = 100-50 = 50
cost = left + right = 159
现在考虑用x来改变这个值。如果x足够小,使相同的数字位于左侧,则值将更改为:

left(x) = |50+x-1|+|50+x-20|+|50+x-30|+|50+x-40| = 109 + 4x
right(x) = |50+x-100| = 50 - x
cost(x) = left(x)+right(x) = 159+3x
因此,如果我们设置x=-1,我们将减少3的成本,因此最好的答案不是50

如果我们移动,我们的成本将发生变化,这是由我们左边的数字4和右边的数字1之间的差值给出的

因此,只要这些是不同的,我们总是可以通过向中间值移动来降低成本

因此,中位数给出的成本最低


如果有偶数个点,例如1100,那么两个中间点之间的所有数字都将给出相同的成本,因此可以选择这些值中的任何一个。

这个答案给出了一个示例,解释了为什么找到重复次数的中值会产生最低的成本

假设我们有价值观:

1 20 30 40 100
我们试图找到与所有这些值的总距离最短的值

我们可能猜测最好的答案是50,成本为50-1++50-20++50-30++50-40++50-100=159

将其分为两部分,左边和右边,左边是目标左边所有数字的成本,右边是右边所有数字的成本

left = |50-1|+|50-20|+|50-30|+|50-40| = 50-1+50-20+50-30+50-40 = 109
right = |50-100| = 100-50 = 50
cost = left + right = 159
现在考虑用x来改变这个值。如果x足够小,使相同的数字位于左侧,则值将更改为:

left(x) = |50+x-1|+|50+x-20|+|50+x-30|+|50+x-40| = 109 + 4x
right(x) = |50+x-100| = 50 - x
cost(x) = left(x)+right(x) = 159+3x
因此,如果我们设置x=-1,我们将减少3的成本,因此最好的答案不是50

如果我们移动,我们的成本将发生变化,这是由我们左边的数字4和右边的数字1之间的差值给出的

因此,只要这些是不同的,我们总是可以通过向中间值移动来降低成本

因此,中位数给出的成本最低



如果点数为偶数,如1100,则两个中间点之间的所有数字将给出相同的成本,因此可以选择这些值中的任何一个。

这是针对第1B轮的吗?@phyrrus9是的。比赛结束了,所以我问。技术上结束了,但你不应该问,因为我们需要看你的代码来帮助。我个人还没有参加第一轮比赛,但我计划参加1C,但如果你添加一些代码,我可以看一看。如果需要,只需在编辑后添加注释即可。提示1:首先,我们想确定两个字符串是否可以相互转换。假设在每个字符串中,我们用该字符的一个副本替换同一字符的所有运行。如果两个字符串现在相等,这能告诉我们什么吗?如果他们不相等,这能告诉我们什么吗?@j_random_hacker我想出了一个办法,看看我们是否能转换。将多个组件转换为单个组件,并检查所有组件是否相等。不知道如何获得最小转换计数这是1B轮的吗?@phyrus9是的。比赛结束了,所以我问。技术上结束了,但你不应该问,因为我们需要看你的代码来帮助。我个人还没有参加第一轮比赛,但我计划参加1C,但如果你添加一些代码,我可以看一看。如果需要,只需在编辑后添加注释即可。提示1:首先,我们想确定两个字符串是否可以相互转换。假设在每个字符串中,我们用该字符的一个副本替换同一字符的所有运行。如果两个字符串现在相等,这能告诉我们什么吗?如果他们不相等,这能告诉我们什么吗?@j_random_hacker我想出了一个办法,看看我们是否能转换。将多个组件转换为单个组件,并检查所有组件是否相等。不知道如何使最小转换计数+1:顺便说一句,我认为最好的重复次数总是由中位数给出的。你不需要字母和重复,因为你已经表明它们以相同的顺序共享相同的字母,除了可能的重复。在这一阶段,仅仅是重复就足够了。@Peterderivez中位数并不总是正确的选择。考虑A,A,A,AA,AAA。将它们全部改为aa需要4美元。将其更改为成本3。@ooga在您的示例中,长度为1,1,1,2,3,因此中位数为1。换句话说,我同意正确的选择是a,但我也声称它是中位数?@peterdererivaz我试图找到一个反例,但没有找到。还有,有证据证明这一点吗?+1:顺便说一句,我认为最好的重复次数总是由中位数给出。你不需要字母和重复,因为你已经证明它们以相同的顺序共享相同的字母,除了可能
为了重复。在这一阶段,仅仅是重复就足够了。@Peterderivez中位数并不总是正确的选择。考虑A,A,A,AA,AAA。将它们全部改为aa需要4美元。将其更改为成本3。@ooga在您的示例中,长度为1,1,1,2,3,因此中位数为1。换句话说,我同意正确的选择是a,但我也声称它是中位数?@peterdererivaz我试图找到一个反例,但没有找到。不过,有证据证明这一点吗?