爱丽丝正在玩一款游戏,她按照以下规则从一块石头跳到另一块石头:
圆圈中有n个岩石
每个摇滚都标有一个数字,告诉她跳跃的长度
每次她跳到下一个岩石时,她跳跃的岩石数量减少了一个
当她到达标有0
可以向前或向后跳转
一旦你选择了一个向这个方向跳跃的方向
现在给出一个代表岩石的数组。我们需要从任何可能的位置开始计算她可以行驶的最大路径。
示例设N = 2,跳跃数组为[1,2],此处答案为4。
说明:绘制一个圆圈并假设该圆圈两侧各有两块岩石。现在想象爱丽丝站在标有1的岩石上。这意味着她必须跳出1号长度,让她离开她的下一块岩石(在这种情况下,如果她向前或向后跳跃,它会让她留在岩石2但我们假设她这次正在向前跳)并且数组现在是[0,2]。由于她现在站在岩石2,她将跳跃长度2,让她在岩石2(现在将标记为1)。 现在她有了这个数组:[0,1]并且她的最后一次跳跃从1到0。 所以最终数组为[0,0],她进行了4次跳跃(1 + 2 + 1)。
我的尝试:
192.168.2.0/24
但它为解释的输入提供3而不是4.请帮助找到解决此问题的方法
答案 0 :(得分:1)
目前,您拥有以下界限:
for(int k = i; j[k] != 0;) {
if(k >= o.size()) // This test is misplaced, we already access `j[k]`
k -= o.size();
int t = k;
k += j[k]; // `k` may be out of bound here.
--j[t];
y++; // as noted, you score here number of jump and not length of path
}
您可以将功能拆分为较小的部分,如下所示:
enum Direction
{
Backward = -1,
Forward = 1
};
int jump(std::vector<int> rocks, int start, Direction dir) {
int score = 0;
for(int i = start; rocks[i] != 0;) {
score += rocks[i];
int new_i = i + dir * rocks[i];
while (new_i < 0) {
new_i += rocks.size();
}
while (new_i >= rocks.size()) {
new_i -= rocks.size();
}
--rocks[i];
i = new_i;
}
return score;
}
int jump(const std::vector<int>& rocks) {
int best = 0;
for(int i = 0; i < rocks.size(); i++) {
const int score_backward = jump(rocks, i, Direction::Backward);
const int score_forward = jump(rocks, i, Direction::Forward);
best = std::max({best, score_backward, score_forward});
}
return best;
}
允许
答案 1 :(得分:0)
您想计算跳跃次数(3)还是跳跃距离(4)?
你的问题在这一点上并不清楚。
如果你想计算跳跃次数,你似乎得到了正确答案。
如果要计算距离,则应更改:
--j[t];
y++;
到
y += j[t];
--j[t];