Alternative Cake Manufacturing(ACM)有 n 名员工。他们现在就一些非常重要的问题进行投票,世 界主要媒体正试图预测投票结果。每个雇员都属于两个部分中的一个:D 队或 R 队,这两个部分对投票结 果有相反的意见。投票程序相当复杂:n 名雇员中的每一名都发表声明。他们从雇员 1 开始逐一发表声明, 并以雇员 n 结束。如果在第 i 名雇员发表声的时刻,他可以选择一名雇员使其无法进行投票(被选择的雇 员将被取消投票)。 一轮结束后,如果具有投票资格的人数大于 1,则重复上述操作,直到只有一名员工有资格投票,并确 定整个投票的结果。当然,他投票支持他所在的队伍。您知道雇员将要投票的结果以及他们的最佳选择, 请预测投票结果。
时间: 2024-03-18 16:39:23 浏览: 12
这是一个约瑟夫问题的变形,可以使用队列来解决。
首先,将所有D队员和R队员分别存储到两个队列中。然后,依次遍历队列中的每个元素,模拟每个员工的发言过程。如果该员工可以选择一名雇员使其无法进行投票,则将该雇员从队列中删除。最后,判断队列中剩余的一方胜利。
具体实现细节见下面的代码注释:
```C++
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
char a[200005];
while (~scanf("%d", &n)) {
scanf("%s", a);
queue<int> d, r;
// 将D和R队员分别存储到两个队列中
for (int i = 0; i < n; i++) {
if (a[i] == 'D') {
d.push(i);
} else {
r.push(i);
}
}
// 模拟每个员工的发言过程
while (!d.empty() && !r.empty()) {
int D = d.front();
int R = r.front();
d.pop();
r.pop();
if (D < R) {
// D队员将R队员删除,将其重新加入队列(模拟发言过程)
r.push(R + n);
} else {
// R队员将D队员删除,将其重新加入队列(模拟发言过程)
d.push(D + n);
}
}
// 判断队列中剩余的一方胜利
if (!d.empty()) {
printf("D\n");
} else {
printf("R\n");
}
}
return 0;
}
```