题目链接:
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 }
时间: 2024-11-09 20:16:52