【发布时间】:2015-02-21 10:46:33
【问题描述】:
我必须在我的大学做一个小作业:
我有一个运行“n”个独立服务的服务器。所有这些服务在过去同时启动。并且每个服务 'i' 会在一段时间 's[i]' (以秒为单位)后将 'b[i]' 行写入服务器上的日志文件。输入由“l”日志文件的行数和“n”服务数组成。然后我们在每个服务 i 的下 'n' 行中有:'s[i]' 提到的时间段和 'b[i]' 服务写入日志文件的行数。
我必须根据日志文件中的行数来计算程序都开始运行的时间(以秒为单位)。示例:
input:
19 3
7 1
8 1
10 2
Output:
42
我必须使用分而治之,但我什至无法弄清楚如何将其拆分为子问题。我还必须使用这个函数,其中 ss 是服务周期的数组, bs 是每个服务写入日志文件的行数:
long linesAt(int t, int[] ss, int[] bs) {
long out = 0;
for (int i = 0; i < ss.length; i++) {
// floor operation
out += bs[i] * (long)(t/ss[i]);
}
return out;
ss 和 bs 基本上是输入的数组,如果我们举个例子,它们看起来像这样,上面的行是数组的索引:
ss:
0 1 2
7 8 10
bs:
0 1 2
1 1 2
很容易看出42应该是输出
linesAt(42) = floor(42/7)*1+floor(42/8)*1+floor(42/10)*2 = 19
现在我要写一个函数
int solve(long l, int[] ss, int[] bs)
我已经用蛮力写了一些伪代码,但我不知道如何用分而治之的范式解决这个问题,我的伪代码如下所示:
Solve(l, ss, bs)
out = 0
t = 0
while (out != l)
out = linesAt(t, ss, bs)
t++
end while
return t
我认为我必须以某种方式拆分 l,以便计算较小长度的时间。但我真的不明白怎么做,因为当你看这个时,它似乎是不可能的:
t out
0..6 0
7 1
8 2
9 2
10 4
11..13 4
14 5
15 5
16 6
17..19 6
20 8
...
40 18
42 19
尚塔尔。
【问题讨论】:
-
Chantal,您是否将问题的文本翻译成另一种语言。
-
不,我没有,为什么?我的英语这么差吗?
-
不,只是你的名字听起来像法语。我没有完全理解这个问题。
-
@Chantal 我认为您的意思是每个服务在不同的时期后写入不同数量的行。将这些值标记为“b”和“s”是令人困惑的,因为这意味着它们对于每个服务都是相同的。通常人们会写“'b[i]'(其中 i 是服务)”,或者使用另一种表示存在多个值的表示法。
-
@Tarik 你现在明白了吗?
标签: java recursion brute-force divide-and-conquer floor