我很难理解如何在不引起内存分配问题的情况下解决此问题。我很确定我的逻辑是合理的,但不幸的是,这似乎并不够好。有没有人对此有任何建议,所以我可以理解如何更有效地编写代码?
问题在于: 样本输入: 1 5 2 1 样本输出 2 有N = 5名囚犯和M = 2名儿童。分发从ID号S = 1开始,因此囚犯1获得第一个甜蜜,囚犯2获得第二个(最后)甜蜜。因此,我们必须向囚犯发出关于毒药的警告,所以我们在新线上打印2。
# Enter your code here. Read input from STDIN. Print output to STDOUT
n = gets.strip.to_i
n.times do
arr = gets.strip.split(" ").map { |s| s.to_i}
prisoners = arr[0].to_i
sweets = arr[1].to_i
position = arr[2].to_i
prisoners_array = (1..prisoners).map { |p| p.to_i}
starting_position = prisoners_array[position - 1]
end_position = prisoners_array.size
awesome_array = (starting_position..end_position).map { |p| p.to_i}
awesomer_array = (prisoners_array[0]...starting_position).map { |p| p.to_i}
awesomest_array = awesome_array + awesomer_array
warning = 0
if sweets > prisoners
sweets = sweets % prisoners
end
for i in awesomest_array
warning += 1
if warning === sweets
puts prisoners_array[i - 1]
end
end
end
答案 0 :(得分:2)
This appears to be有问题的练习。这里的关键是管理你使用模数(计算0索引位置)和问题(使用1索引位置)。
在示例中,我们有 5人(n),并希望从 person#1(s)开始,对 2个位置(m)进行迭代)即可。人#1是索引位置0,我们通过从s
中减去一个来计算。我们还必须从行进距离t
中减去一个,因为到达起始位置被认为是第一步。我们有s+m-2
。
通过得到这个结果数,以%
为总人数,我们将计算出我们最终得到的0指数位置。我们需要向这个数字添加一个以转换回1索引系统。
虽然可以采用长形式的方法解决锻炼问题(例如通过填充数组并实际迭代它们),但这个问题也可以解决如下:
# Enter your code here. Read input from STDIN. Print output to STDOUT
gets.strip.to_i.times do
# n - number of prisoners
# m - number of sweets
# s - starting id
n, m, s = gets.split.map &:to_i
puts ((m+s-2) % n) + 1
end
答案 1 :(得分:0)
new CountDownTimer(6000, 1000) {
public void onTick(long millisUntilFinished) {
// do every 1 second
}
public void onFinish() {
// show your toast after 6 seconds.
}
}.start();