Leetcode 649. Dota2 参议院
题目
Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)
Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:
-
禁止一名参议员的权利:
参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。
-
宣布胜利:
如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。
给定一个字符串代表每个参议员的阵营。字母 “R” 和 “D” 分别代表了 Radiant(天辉)和 Dire(夜魇)。然后,如果有 n 个参议员,给定字符串的大小将是 n。
以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。这一过程将持续到投票结束。所有失去权利的参议员将在过程中被跳过。
假设每一位参议员都足够聪明,会为自己的政党做出最好的策略,你需要预测哪一方最终会宣布胜利并在 Dota2 游戏中决定改变。输出应该是 Radiant 或 Dire。
测试样例
示例 1:
输入: "RD"
输出: "Radiant"
解释: 第一个参议员来自 Radiant 阵营并且他可以使用第一项权利让第二个参议员失去权力,因此第二个参议员将被跳过因为他没有任何权利。然后在第二轮的时候,第一个参议员可以宣布胜利,因为他是唯一一个有投票权的人
示例 2:
输入: "RDD"
输出: "Dire"
解释:
第一轮中,第一个来自 Radiant 阵营的参议员可以使用第一项权利禁止第二个参议员的权利
第二个来自 Dire 阵营的参议员会被跳过因为他的权利被禁止
第三个来自 Dire 阵营的参议员可以使用他的第一项权利禁止第一个参议员的权利
因此在第二轮只剩下第三个参议员拥有投票的权利,于是他可以宣布胜利
注意:
- 给定字符串的长度在 [1, 10,000] 之间.
题解
贪心算法
我们用循环链表把参议员链接起来,对于当前玩家,它就让其后的不同阵营的参议员失去权力,直到只剩一个阵营时。详细过程见代码
代码
struct Node{
char belonging;
Node* next;
Node(char belonging){
this->belonging = belonging;
next = NULL;
}
};
string predictPartyVictory(string senate) {
int n=senate.size(),R=0,D=0;
Node* head = new Node(senate[0]);
Node* pre = head;
if(senate[0] == 'R') R++;
else D++;
for(int i=1; i<n; i++){ //构造循环链表
Node* now = new Node(senate[i]);
if(senate[i] == 'R') R++;
else D++;
pre->next = now;
pre = now;
}
pre->next = head;
Node* now = head;
while(R!=0 && D!=0){ //属于统一阵营时结束循环
Node* outN = now;
while(outN->next->belonging == now->belonging) outN = outN->next; //找到其后的第一个不同阵营的结点
outN->next = outN->next->next; //让其失去权力,即删除节点
if(now->belonging == 'R') D--;
else R--;
now = now->next;
}
return R==0? "Dire" : "Radiant";
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dota2-senate
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。