【问题标题】:Implement Unmonopoly game using priority queues?使用优先队列实现 Unmonopoly 游戏?
【发布时间】:2017-12-15 18:57:32
【问题描述】:

一群孩子想玩一个游戏,叫做 UnMonopoly ,其中每回合钱最多的玩家必须把他/她的一半钱给钱最少的玩家。回合结束后,宣布奖金最高的人为获胜者。通过计算回合数和玩家数来实现这个游戏。 (提示:使用优先队列)

示例输入:

玩家人数:n

圈数:m

输入每个玩家的详细信息和金钱

输出:

获胜者是:玩家姓名

这是我的问题,我已经写了一个代码。这是一种正确的实施方式还是有任何缺陷。有没有时间复杂度更小的更好的实现方式?

这是我的代码,

import java.util.*;

class Player implements Comparator<Player> {

    String name;
    int money;
    Player(String name, int m) {
        this.name = name;
        money = m;
    }
    public Player() {
        this.money = 0;
        this.name = null;
    }

    public String toString() {
        return "NAME: "+name+"\nMONEY: "+money;
    }

    public int compare(Player p1, Player p2) {
        return p2.money - p1.money;
    }
}

public class Unmonopoly {

    public static void main(String[] args) {

        Player pl = new Player();
        Stack<Player> pla = new Stack<Player>();
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the number of players: ");
        int n = sc.nextInt();

        PriorityQueue<Player> play = new PriorityQueue<Player>(n,pl);
        System.out.println("Enter player details: ");

        for(int i = 0; i < n; i++) {
            Player p = new Player(sc.next(),sc.nextInt());
            play.add(p);
        }

        for(Player p: play) {
            System.out.println("Name: "+p.name+"\nMoney: "+p.money);
        }

        System.out.println("\nEnter the number of turns: ");
        int turns = sc.nextInt();
        for(int i = 0; i < turns; i++) {
            Player max = play.peek();
            max.money = max.money / 2;
            while(!play.isEmpty()) {
                pla.push(play.peek());
                play.remove();
            }
            Player min = pla.pop();
            pla.push(min);
            System.out.println("Player with min money is: \n"+min);
            min.money = min.money + max.money;
            while(!pla.isEmpty()) {
                play.add(pla.peek());
                pla.pop();
            }
        }
        sc.close();
        System.out.println("**************WINNER************** \n\n\tNAME:   "+play.peek().name+"\n\tMONEY:  "+play.peek().money);
    }
}

【问题讨论】:

    标签: java algorithm


    【解决方案1】:

    您的复杂度为 O(N * M * log(N)),因为您每轮都重新创建优先级队列。

    不确定提示的有效性,因为您每回合都需要最小和最大玩家,因此更好的数据结构可能是 TreeSet - 它允许您直接获得最小值和最大值。复杂度将是 O(M * log(N))..

    这种情况下的主循环就是:

    for (int i = 0; i < turns; i++) {
        Player min = players.pollFirst();
        Player max = players.pollLast();
    
        min.money += max.money / 2;
        max.money -= max.money / 2;
    
        players.add(min);
        players.add(max);
    }
    

    polladd 的操作都是 O(log(N))..

    【讨论】:

    • 其实我是一个初学者,我还不知道树集,而且我被限制使用优先级队列。
    • 你确定你被限制了吗?看起来这是一个提示,而不是要求..无论如何,我不知道如何使用具有改进时间复杂度的优先级队列来做到这一点,而且使用 TreeSet 非常容易..
    • 是的。我的导师给了我一个限制,只能使用优先级队列。无论如何,感谢您的建议,当我了解 Tree Set 时,我一定会实施。
    • 好吧,要么你的导师很困惑,要么我很困惑:)如果确实存在一个更快的优先队列算法,请在这里写一个答案,我会很感兴趣。
    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多