当前位置: 首页 > 知识库问答 >
问题:

HackerRank上两个栈博弈的正确算法

邢飞昂
2023-03-14

在每次移动中,Nick可以从堆栈A或B堆栈的顶部移除一个整数。

Nick保存从两个堆栈中移除的整数的运行和。

如果Nick在任何一点上的运行和大于游戏开始时给定的某个整数X,他将被取消比赛资格。

Sample Input 0

1 -> Number of games
10 -> sum should not exceed 10 
4 2 4 6 1  -> Stack A
2 1 8 5 -> Stack B

Sample Output 

4
1
67
19 9 8 13 1 7 18 0 19 19 10 5 15 19 0 0 16 12 5 10 - Stack A
11 17 1 18 14 12 9 18 14 3 4 13 4 12 6 5 12 16 5 11 16 8 16 3 7 8 3 3 0 1 13 4 10 7 14 - Stack B

我不明白算法,它看起来像DP,对我来说,有人能帮助我的方法/算法吗?

**

public class Default {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int numOfGames = Integer.parseInt(br.readLine());
        for (int i = 0; i < numOfGames; i++) {
            String[] tmp = br.readLine().split(" ");
            int numOfElementsStackOne = Integer.parseInt(tmp[0]);
            int numOfElementsStackTwo = Integer.parseInt(tmp[1]);
            int limit = Integer.parseInt(tmp[2]);
            int sum = 0;
            int popCount = 0;

            Stack<Integer> stackOne = new Stack<Integer>();
            Stack<Integer> stackTwo = new Stack<Integer>();

            String[] stOne = br.readLine().split(" ");
            String[] stTwo = br.readLine().split(" ");

            for (int k = numOfElementsStackOne - 1; k >= 0; k--) {
                stackOne.push(Integer.parseInt(stOne[k]));
            }

            for (int j = numOfElementsStackTwo - 1; j >= 0; j--) {
                stackTwo.push(Integer.parseInt(stTwo[j]));
            }

            while (sum <= limit) {
                int pk1 = 0;
                int pk2 = 0;
                if (stackOne.isEmpty()) {
                    sum = sum + stackTwo.pop();
                    popCount++;
                } else if (stackTwo.isEmpty()) {
                    sum = sum + stackOne.pop();
                    popCount++;
                } 
                else if (!stackOne.isEmpty() && !stackTwo.isEmpty()) {
                    pk1 = stackOne.peek();
                    pk2 = stackTwo.peek();

                    if (pk1 <= pk2) {
                        sum = sum + stackOne.pop();
                        popCount++;
                    } else {
                        sum = sum + stackTwo.pop();
                        popCount++;
                    }
                } else if(stackOne.isEmpty() && stackTwo.isEmpty()){
                    break;
                }
            }

            int score = (popCount>0)?(popCount-1):0;
            System.out.println(score);
        }
    }
}

共有1个答案

商和颂
2023-03-14

好的,我将尝试解释一个算法,基本上可以用O(n)解决这个问题,你需要尝试自己编码。

我会用一个简单的例子来解释,你可以反映出来

1 -> Number of games
10 -> sum should not exceed 10  
4 2 4 6 1  -> Stack A
2 1 8 5 -> Stack B

首先您需要创建2个数组,数组将包含所有数的总和,直到它的堆栈索引,例如,对于堆栈A,您将有以下数组

4 6 10 16 17  //index 0 ->4
2 3 11 16
a = 1 1 1 211 2
b = 1 85
a' = 1 2 3 214 216
and b' = 1 86
current sum = 86+216 > 217
216/5~43.2` and `86/2=43`, 

所以我们在a‘中移动指针。但是,这并不能解决问题--“

214+86 is still > 217!!` 

如果我们移除86个,会更好!因此,我们应该继续删除与前一个元素有较大差异的元素!

如果两个值都相等,则顺理成章地移动与前一个值有较大差异的值上的索引(请记住,我们是以相反的顺序移动索引)。

 类似资料:
  • 我试图测试自己理解递归的能力,所以我给自己一个任务,在递归中做跳跃游戏练习 给定一个非负整数数组,您最初位于数组的第一个索引处。数组中的每个元素代表该位置的最大跳转长度。你的目标是在最小的跳跃次数内达到最后一个指数。 https://leetcode.com/problems/jump-game-ii/ 我试图修改这部分代码,但它没有出现在调试器上,因此我没有真正看到这部分代码中的问题 如果有人能

  • 这是一个链接: https://www.hackerrank.com/challenges/sherlock-and-anagrams/problem?h_l=interview 这是我不同意的部分: 在位置[[[0],[1]],[[0],[2]],[[0],[3]],[[1],[2]],[[1],[3]]有6个形式[k, k]的字谜 和[[2],[3]]。 在位置[[0,1],[1,2]],[[

  • 我正在制作一个2人迷宫跑者游戏,我遇到了一些键盘事件的麻烦。如果两个玩家同时击中一个键,只有玩家1移动,因为我的代码首先测试的是Player1的事件。在python和pygame中是否有一种方法可以同时检查这两个事件?下面是我的player1课的一部分: 很抱歉出现了代码块,但这对您理解它是如何工作的都是必要的。我为Player2提供了一个几乎相同的类,但使用了不同的键盘控制(WASD而不是箭头键

  • 在这个程序中,用户必须想出一个数字,然后让计算机来猜。 2.我试过这个程序,但电脑的猜测很奇怪。计算机不会根据我的指南猜出一个数字。

  • 我正在设计一个学习如何玩跳棋游戏的前馈神经网络。 对于输入,必须给出棋盘,输出应该给出赢与输的概率。但是什么是理想的棋盘到一排数字的转换?有32个可能的方块,每个方块上有5种不同的可能性(国王或一块白或黑玩家和自由位置)。如果我为每个正方形的每个可能值提供一个输入单位,那么它将是32 * 5。另一种选择是: 在这种情况下,输入长度将仅为 64,但我不确定哪一个会给出更好的结果。谁能对此给出任何见解

  • 我正在用C编写一个基于文本的游戏。我想知道在不嵌套这么多if语句的情况下,如何处理不同的事件。我说的一个例子是。。。 我如何在不分支if语句的情况下实现这个概念?