问题陈述在problem给出,如下: -
N学生厌倦了计算机课,所以他们看有趣的视频剪辑 在YouTube上。
该网站包含K个流行剪辑,编号为1到N.当视频时 观看剪辑,在屏幕上显示类似的视频剪辑列表 侧。
每个学生都从主页面中选择一个视频片段并开始播放 看着它。一分钟后,每个学生都对他感到无聊 或者她的视频剪辑,所以他打开了列表中的第一个视频片段 侧面有类似的剪辑(即使他已经看过那个片段)。
编写一个程序,为每个学生确定哪个视频片段 将在课程的第M分钟观看。
现在我知道如何解决这个问题,我们找到路径,如果它包含一个循环。我们用它的时期得到答案。
但是我已经在互联网上找到了一种更快的方法,因为它是一个未记录的代码,而且我是一个新手,我无法弄清楚下面的代码中发生了什么。
int N = in.nextInt (), K = in.nextInt (), M = in.nextInt () - 1;//Reading input
int log = Integer.numberOfTrailingZeros (Integer.highestOneBit (M)) + 1;
int [][] next = new int [K][log + 1];
int [] start = new int [N];
for (int i = 0; i < N; i++)
start [i] = in.nextInt () - 1;
for (int i = 0; i < K; i++)
next [i][0] = in.nextInt () - 1;
for (int i = 1; 1 << i <= M; i++)
for (int j = 0; j < K; j++)
next [j][i] = next [next [j][i - 1]][i - 1];
for (int i = 0; 1 << i <= M; i++)
if (((1 << i) & M) > 0)
for (int j = 0; j < N; j++)
start [j] = next [start [j]][i];
out.print (start [0] + 1);
for (int i = 1; i < N; i++)
out.print (" " + (start [i] + 1)); //writing output
我们如何才能有效地解决问题/无需寻找周期? 或者上面的代码如何解决问题?
答案 0 :(得分:1)
此解决方案通过对矩阵求平方来使用取幂。对于每个视频,相关视频列表是预先确定的,因此您知道哪个视频是此列表中的第一个。因此,对于每个视频,您都知道下一个要观看的视频。
你有一个简单的转换矩阵。在第i
行,您将只有一个1
- 位于视频编号i
之后的下一个视频的索引处,所有剩余的元素将为0.取此矩阵并将其提升为m-1
- 你会得到一个转换矩阵,如果你开始使用视频i
,它会显示你将在第m分钟观看哪个视频。这也解释了为什么解决方案的作者在阅读后从M
的输入中减去1。
答案 1 :(得分:0)
上面的代码忽略了cicles。他使用类似于快速取幂的自下而上动态编程方法。他使用下一个矩阵来存储每个学生在1,2,2 ^ 2等步骤之后的下一个位置。这是第3次的工作。然后,在第4个中,他用二进制构造M.这样,如果M = 2 ^ 3 + 2 ^ 0,可以计算每个学生的位置,首先计算2 ^ 0分钟后的位置,将其指定为基准位置,然后计算2 ^ 3分钟后的位置。位置。
如果您查看有关快速取幂的信息,您会发现使用此O(N log(M))存储空间是不必要的,因为只有一个请求可以计算最终位置在进行&#34;快速取幂时#34;步骤