Dota2参议院[贪心与队列]

前言

贪心思想 与 队列数据结构的配合,算法题往往就是这样,一种思想配一些数据结构来完美解题。

一、dota2参议院

在这里插入图片描述

二、贪心与队列

target:每个人都有禁止别人 和 被别人禁止的 功能,有两队人马,根据顺序,以最好的策略禁止对方,那边会赢?

1-什么是最好的方式禁止对方?
一方得到投票权,那就把最近的另一方可投票的人禁止,让其发挥不了禁止权就被踢出局,那么前一方就尽可能的少损失队员。

core:让一个人还没发挥禁止权就把他踢出局,这是最好的;其次才是把发挥过禁止权的踢出局;

2-怎么才能快速找到另一方的投票人(找到了才能禁止啊!)?
可把两方分类,存入两方人的位置。

3-怎么才能把把禁止的人踢出,而且让禁止别人的人放在后面下一轮再投票?
位置处于小的即处于优势,另一类出队列就不用再入队了,有优势一方入队,且只能在下一轮有禁止优势,则将位置增大n >= senate.length

package everyday.greed;

import java.util.LinkedList;
import java.util.Queue;

// Dota2参议院
public class PredictPartyVictory {
    /*
    target:每个人都有禁止别人 和 被别人禁止的 功能,有两队人马,根据顺序,以最好的策略禁止对方,那边会赢?
    什么是最好的方式禁止对方?一方得到投票权,那就把最近的另一方可投票的人禁止,让其发挥不了禁止权就被踢出局,那么前一方就尽可能的少损失队员。
    core:让一个人还没发挥禁止权就把他踢出局,这是最好的;其次才是把发挥过禁止权的踢出局;
    怎么才能快速找到另一方的投票人(找到了才能禁止啊!)?可把两方分类,存入两方人的位置。
    怎么才能把把禁止的人踢出,而且让禁止别人的人放在后面下一轮再投票?
    位置处于小的即处于优势,另一类出队列就不用再入队了,有优势一方入队,且只能在下一轮有禁止优势,则将位置增大n >= senate.length

    注:模拟起来复杂的地方,就应该换思路/换角度看,利用已学的数据机构和算法思维来关联。
    注:多问为什么?不仅包括深挖与探究,还包括为什么会想到这个解题答案,问题与答案有什么关联?不能纯靠题感!要双份保险,让我笔试能过。
    注:平时主多个为什么;竞赛主题感。毕竟平时的积累,才能把题感拉起来。
     */
    public String predictPartyVictory(String senate) {
        // 位置属性 & 类别属性
        Queue<Integer> r = new LinkedList<>();
        Queue<Integer> d = new LinkedList<>();

        char[] arr = senate.toCharArray();
        int i = 0, n = arr.length;
        for (char c : arr) {
            if (c == 'R') r.offer(i++);
            else d.offer(i++);
        }

        while (!r.isEmpty() && !d.isEmpty()) {
            int a = r.poll(), b = d.poll();
            if (a < b) {
                r.offer(a + n);
            } else d.offer(b + n);
        }
        return r.isEmpty() ? "Dire" : "Radiant";
    }
}

总结

1)模拟起来复杂的地方,就应该换思路/换角度看,利用已学的数据机构和算法思维来关联。
2)多问为什么?不仅包括深挖与探究,还包括为什么会想到这个解题答案,问题与答案有什么关联?不能纯靠题感!要双份保险,让我笔试能过。
3)平时主多个为什么;竞赛主题感。毕竟平时的积累,才能把题感拉起来。

参考文献

[1] LeetCode Dota2参议院

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值