题目:跳转至 649. Dota2 参议院
Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)
Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:

  1. 禁止一名参议员的权利:
    参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。
  2. 宣布胜利:
    (如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。)

给定一个字符串代表每个参议员的阵营。字母 “R” 和 “D” 分别代表了 Radiant(天辉)和 Dire(夜魇)。然后,如果有 n 个参议员,给定字符串的大小将是 n。

以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。这一过程将持续到投票结束。所有失去权利的参议员将在过程中被跳过。

假设每一位参议员都足够聪明,会为自己的政党做出最好的策略,你需要预测哪一方最终会宣布胜利并在 Dota2 游戏中决定改变。输出应该是 Radiant 或 Dire。

示例 1:
输入:“RD”
输出:“Radiant”
解释:第一个参议员来自 Radiant 阵营并且他可以使用第一项权利让第二个参议员失去权力,因此第二个参议员将被跳过因为他没有任何权利。然后在第二轮的时候,第一个参议员可以宣布胜利,因为他是唯一一个有投票权的人
示例 2:
输入:“RDD”
输出:“Dire”
解释:
第一轮中,第一个来自 Radiant 阵营的参议员可以使用第一项权利禁止第二个参议员的权利
第二个来自 Dire 阵营的参议员会被跳过因为他的权利被禁止
第三个来自 Dire 阵营的参议员可以使用他的第一项权利禁止第一个参议员的权利
因此在第二轮只剩下第三个参议员拥有投票的权利,于是他可以宣布胜利

提示:

  • 给定字符串的长度在 [1, 10,000] 之间.
class Solution {public:string predictPartyVictory(string senate) {}
};

思路:
读完题目想到了一堆石头你拿一块我拿两块最后拿完的人胜利的那题,那好像还可以是个数学问题。
扯远了,回到这题,按轮来,同时最终条件是投票的都是同一阵营,那在没达到这个条件前,所有人的最优解都是选取权力一:禁止对方参议员的权利,而且是对方具有优先投票权的人(顺序在前)。
暴力模拟硬写出来的,如果一位议员被禁止,就改成X(闭嘴无人权),如果轮流到R,则他轮流到的第一个D变成X,反之亦然。一直循环直到R或者D一派全都变成X。

class Solution {public:string predictPartyVictory(string senate) {int len=senate.length();if(len==1)return senate[0]=='R'?"Radiant":"Dire";int countR=0;for(auto x:senate)if(x=='R')++countR;int countD=len-countR;int diffR=0,diffD=0;int i=0;  //注意越界while(countD!=diffD && countR!=diffR){  //如果仍存在R或者Dif(senate[i]=='X'){++i;if(i==len)i=0;continue;}char s=senate[i]=='R'?'D':'R';int tmp=findNextSenate(senate,i,s);  //找寻下面第一个与自己党派不同的人senate[tmp]='X';if(s=='R')++diffR;else++diffD;++i;if(i==len)i=0;}return diffR==countR?"Dire":"Radiant";}int findNextSenate(string senate,int index,char s){int len=senate.length();int i=0;while(i<len){int cur=(i+index)<len?i+index:i+index-len;  //按轮查找确保不越界,index必属于[0,len-1]if(senate[cur]!='X'){if(senate[cur]==s)return cur;}++i;}return -1;  //不存在}
};

看了题解,又想吹彩虹屁了(送自己一个X),利用队列记录下每位R和D出场的序号,两队的队首谁小谁就有发言权。如果被禁言,就pop再见,如果这轮存活,继续下一轮,不能穷追不舍不讲武德,所以序号加上总人数到下一轮再出场。直至最后还有人的那组就是赢家。

class Solution {public:string predictPartyVictory(string senate) {int n = senate.size();queue<int> radiant, dire;for (int i = 0; i < n; ++i) {if (senate[i] == 'R') {radiant.push(i);}else {dire.push(i);}}while (!radiant.empty() && !dire.empty()) {if (radiant.front() < dire.front()) {radiant.push(radiant.front() + n);}else {dire.push(dire.front() + n);}radiant.pop();dire.pop();}return !radiant.empty() ? "Radiant" : "Dire";}
};

在注明标签的时候有点纠结,题解是循环,有点不得劲,举例选取最合适方案进行模拟,每次禁言都从第一个开始,局部最优,懂了,贪心。

LeetCode每日一题--649. Dota2 参议院(贪心 队列)相关推荐

  1. Leetcode 每日一题——649. Dota2 参议院

    649. Dota2 参议院 Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成.现在参议院希望对一个 Dota2 游戏里的改变作出决 ...

  2. LeetCode每日一题——12.11Dota2 参议院

    Dota2 参议院 题目描述 思路 思路一 思路二 思路三(参考官方解答) 代码(CPP) 思路一实现 思路二实现 思路三实现 题目描述 Dota2 的世界里有两个阵营:Radiant(天辉)和 Di ...

  3. LeetCode 649. Dota2 参议院 | Python

    649. Dota2 参议院 题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/dota2-senate/ 题目 Dota2 的世界里有两个阵营:Ra ...

  4. Java实现 LeetCode 649 Dota2 参议院(暴力大法)

    649. Dota2 参议院 Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成.现在参议院希望对一个 Dota2 游戏里的改变作出决 ...

  5. 力扣649. Dota2参议院 (Java 详细题解)

    649. Dota2 参议院 一.原题题目(中等) 1.1 题目 ​ Dota2 的世界里有两个阵营:Radiant (天辉)和 Dire(夜魇).Dota2 参议院由来自两派的参议员组成.现在参议院 ...

  6. leetcode每日一题·买卖股票问题(Python)

    leetcode每日一题·买卖股票问题(Python) 买卖股票的最佳时机(股票最大利润) 题目链接 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的 ...

  7. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  8. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)

    思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...

  9. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

最新文章

  1. Exchange Server 2000/2003 中设定超过2G的邮箱图解
  2. laravel(二):laravel基本入门 看到Hello Laravel
  3. 分公司访问列表(ACL)
  4. STM32 USART1 USART2 UASRT3 UART4 UART5串口通信测试程序
  5. 【转】 详解C中volatile关键字
  6. 分享:开源货币新世界
  7. javaee互联网轻量级框架整合开发_企业开发:Spring框架的简易、高效切入篇
  8. Hibernate性能优化2( 转)
  9. 凸优化有关的数值线性代数知识三:LU Cholesky和LDL因式分解
  10. Android项目重构之路:界面篇
  11. ccna学习指南,入门必备
  12. ezcad旋转轴标刻参数_激光打标机软件ezcad中菜单下的旋转角度标刻2功能介绍及其操作设置...
  13. 知更鸟php,PHP编辑器:phpDesigner
  14. 面向接口编程与面向实现编程
  15. 谈谈架构师是何种生物
  16. 自学次世代自制力比较差,想报培训班有什么建议?
  17. 学生信息管理系统报告
  18. 网站建设html代码优化,网站设计代码优化让网站打开速度飞起来
  19. c语言camel游戏,将单词从camelCase转换为C中的snake_case
  20. 【Excel】之数据透视表及动态图表

热门文章

  1. java switch----case 分支语句
  2. No variants found for ‘:app‘. Check build files to ensure at least one variant exists.
  3. CSS打造图片翻转立体3D效果
  4. 酒店台式自助开房机-自助入住机介绍
  5. 基于FPGA平台RISCV架构的SOC应用系统设计3
  6. Excel VBA:按日期汇总计算输出结果(sumif)
  7. Linux中mv的作用是,linux中的mv命令的详细解释
  8. 单例,恶汉式 demo
  9. EasyExcel合并单元格,通过注解方式实现自定义合并策略
  10. 物流管理如何利用计算机思维,如何指导毕业计——物流管理专业经验分享.ppt...