返回介绍

solution / 2800-2899 / 2836.Maximize Value of Function in a Ball Passing Game / README_EN

发布于 2024-06-17 01:02:59 字数 11223 浏览 0 评论 0 收藏 0

2836. Maximize Value of Function in a Ball Passing Game

中文文档

Description

You are given a 0-indexed integer array receiver of length n and an integer k.

There are n players having a unique id in the range [0, n - 1] who will play a ball passing game, and receiver[i] is the id of the player who receives passes from the player with id i. Players can pass to themselves, i.e. receiver[i] may be equal to i.

You must choose one of the n players as the starting player for the game, and the ball will be passed exactly k times starting from the chosen player.

For a chosen starting player having id x, we define a function f(x) that denotes the sum of x and the ids of all players who receive the ball during the k passes, including repetitions. In other words, f(x) = x + receiver[x] + receiver[receiver[x]] + ... + receiver(k)[x].

Your task is to choose a starting player having id x that maximizes the value of f(x).

Return _an integer denoting the maximum value of the function._

Note: receiver may contain duplicates.

 

Example 1:

Pass NumberSender IDReceiver IDx + Receiver IDs
   2
1213
2103
3025
4216
Input: receiver = [2,0,1], k = 4
Output: 6
Explanation: The table above shows a simulation of the game starting with the player having id x = 2. 
From the table, f(2) is equal to 6. 
It can be shown that 6 is the maximum achievable value of the function. 
Hence, the output is 6. 

Example 2:

Pass NumberSender IDReceiver IDx + Receiver IDs
   4
1437
2329
32110
Input: receiver = [1,1,1,2,3], k = 3
Output: 10
Explanation: The table above shows a simulation of the game starting with the player having id x = 4. 
From the table, f(4) is equal to 10. 
It can be shown that 10 is the maximum achievable value of the function. 
Hence, the output is 10. 

 

Constraints:

  • 1 <= receiver.length == n <= 105
  • 0 <= receiver[i] <= n - 1
  • 1 <= k <= 1010

Solutions

Solution 1: Dynamic Programming + Binary Lifting

The problem asks us to find the maximum sum of the player IDs who have touched the ball within $k$ passes starting from each player $i$. If we solve it by brute force, we need to traverse upwards $k$ times starting from $i$, with a time complexity of $O(k)$, which will obviously time out.

We can use dynamic programming combined with binary lifting to handle this.

We define $f[i][j]$ as the player ID that can be reached by passing the ball $2^j$ times starting from player $i$, and define $g[i][j]$ as the sum of the player IDs that can be reached by passing the ball $2^j$ times starting from player $i$ (excluding the last player).

When $j=0$, the number of passes is $1$, so $f[i][0] = receiver[i]$, and $g[i][0] = i$.

When $j > 0$, the number of passes is $2^j$, which is equivalent to passing the ball $2^{j-1}$ times starting from player $i$, and then passing the ball $2^{j-1}$ times starting from player $f[i][j-1]$, so $f[i][j] = f[f[i][j-1]][j-1]$, and $g[i][j] = g[i][j-1] + g[f[i][j-1]][j-1]$.

Next, we can enumerate each player $i$ as the starting player, then accumulate upwards according to the binary representation of $k$, and finally get the maximum sum of the player IDs who have touched the ball within $k$ passes starting from player $i$.

The time complexity is $O(n \times \log k)$, and the space complexity is $O(n \times \log k)$. Here, $n$ is the number of players.

Similar problems:

class Solution:
  def getMaxFunctionValue(self, receiver: List[int], k: int) -> int:
    n, m = len(receiver), k.bit_length()
    f = [[0] * m for _ in range(n)]
    g = [[0] * m for _ in range(n)]
    for i, x in enumerate(receiver):
      f[i][0] = x
      g[i][0] = i
    for j in range(1, m):
      for i in range(n):
        f[i][j] = f[f[i][j - 1]][j - 1]
        g[i][j] = g[i][j - 1] + g[f[i][j - 1]][j - 1]
    ans = 0
    for i in range(n):
      p, t = i, 0
      for j in range(m):
        if k >> j & 1:
          t += g[p][j]
          p = f[p][j]
      ans = max(ans, t + p)
    return ans
class Solution {
  public long getMaxFunctionValue(List<Integer> receiver, long k) {
    int n = receiver.size(), m = 64 - Long.numberOfLeadingZeros(k);
    int[][] f = new int[n][m];
    long[][] g = new long[n][m];
    for (int i = 0; i < n; ++i) {
      f[i][0] = receiver.get(i);
      g[i][0] = i;
    }
    for (int j = 1; j < m; ++j) {
      for (int i = 0; i < n; ++i) {
        f[i][j] = f[f[i][j - 1]][j - 1];
        g[i][j] = g[i][j - 1] + g[f[i][j - 1]][j - 1];
      }
    }
    long ans = 0;
    for (int i = 0; i < n; ++i) {
      int p = i;
      long t = 0;
      for (int j = 0; j < m; ++j) {
        if ((k >> j & 1) == 1) {
          t += g[p][j];
          p = f[p][j];
        }
      }
      ans = Math.max(ans, p + t);
    }
    return ans;
  }
}
class Solution {
public:
  long long getMaxFunctionValue(vector<int>& receiver, long long k) {
    int n = receiver.size(), m = 64 - __builtin_clzll(k);
    int f[n][m];
    long long g[n][m];
    for (int i = 0; i < n; ++i) {
      f[i][0] = receiver[i];
      g[i][0] = i;
    }
    for (int j = 1; j < m; ++j) {
      for (int i = 0; i < n; ++i) {
        f[i][j] = f[f[i][j - 1]][j - 1];
        g[i][j] = g[i][j - 1] + g[f[i][j - 1]][j - 1];
      }
    }
    long long ans = 0;
    for (int i = 0; i < n; ++i) {
      int p = i;
      long long t = 0;
      for (int j = 0; j < m; ++j) {
        if (k >> j & 1) {
          t += g[p][j];
          p = f[p][j];
        }
      }
      ans = max(ans, p + t);
    }
    return ans;
  }
};
func getMaxFunctionValue(receiver []int, k int64) (ans int64) {
  n, m := len(receiver), bits.Len(uint(k))
  f := make([][]int, n)
  g := make([][]int64, n)
  for i := range f {
    f[i] = make([]int, m)
    g[i] = make([]int64, m)
    f[i][0] = receiver[i]
    g[i][0] = int64(i)
  }
  for j := 1; j < m; j++ {
    for i := 0; i < n; i++ {
      f[i][j] = f[f[i][j-1]][j-1]
      g[i][j] = g[i][j-1] + g[f[i][j-1]][j-1]
    }
  }
  for i := 0; i < n; i++ {
    p := i
    t := int64(0)
    for j := 0; j < m; j++ {
      if k>>j&1 == 1 {
        t += g[p][j]
        p = f[p][j]
      }
    }
    ans = max(ans, t+int64(p))
  }
  return
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文