CF749C Voting

题目链接:

http://codeforces.com/problemset/problem/749/C

题目大意:

共有n个人,编号为1~n。他们每个人属于且仅属于R阵营或N阵营中的一个。现在他们要进行一场投票。投票可能进行多轮,每一轮投票都是按照从1~n的顺序,当轮到某一人投票的时候,他可以什么都不做,也可以随便挑选一人使他丧失投票的权利。每个人都会代表自己阵营的利益。一个人如果丧失了投票权利,则他直到这场投票结束都不能再投票。投票直到某一阵营一个人都没有的时候就会结束,此时一个人都没有的阵营失败,另一个阵营获胜。

现在给定每个人所属的阵营,问最后哪个阵营会获胜。

解题思路:

采用贪心的思路,每个人都干掉自己后面投票的第一个对手。

具体来说就是用两个队列来模拟两个阵营。分别为D-队列和R-队列。初始分别按顺序加入自己阵营的所有人的编号。每次队头的两个人pk,编号小的一方获胜,将获胜方编号+n并且push到队尾(表示本轮投票结束,将进行下轮投票),失败方直接从本方队列中pop掉即可。最终队列空的一方失败,另一方获胜。

代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 #include <queue>
 5 using namespace std;
 6 
 7 int n;
 8 string s;
 9 
10 int main()
11 {
12     cin >> n >> s;
13     queue<int> qd, qr;
14     for (int i = 0; i < n; i++)
15     {
16         if (s[i] == 'D')
17         {
18             qd.push(i);
19         }
20         else
21         {
22             qr.push(i);
23         }
24     }
25     while (!qd.empty() && !qr.empty())
26     {
27         if (qd.front() < qr.front())
28         {
29             qr.pop();
30             qd.push(qd.front() + n);
31             qd.pop();
32         }
33         else
34         {
35             qd.pop();
36             qr.push(qr.front() + n);
37             qr.pop();
38         }
39     }
40     if (qd.empty())
41     {
42         cout << "R" << endl;
43     }
44     else
45     {
46         cout << "D" << endl;
47     }
48     return 0;
49 }
原文地址:https://www.cnblogs.com/wangyiming/p/6207324.html